From 394edf83ec115ae48b24fb9b19eadf4d7594cf8f Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 5 Jul 2018 18:42:49 +0000 Subject: [PATCH 001/310] Incremented version number - v1.10.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 80dbcd4363..8987f8430c 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.10.0", + "version": "1.10.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 8eea6017fe7418bdc8f8c3d8c938e6b94b67f047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 5 Jul 2018 18:53:59 -0400 Subject: [PATCH 002/310] parseInt uid --- src/user/blocks.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/blocks.js b/src/user/blocks.js index a3021968e8..e2689d8df9 100644 --- a/src/user/blocks.js +++ b/src/user/blocks.js @@ -48,8 +48,8 @@ module.exports = function (User) { }; User.blocks.list = function (uid, callback) { - if (User.blocks._cache.has(uid)) { - return setImmediate(callback, null, User.blocks._cache.get(uid)); + if (User.blocks._cache.has(parseInt(uid, 10))) { + return setImmediate(callback, null, User.blocks._cache.get(parseInt(uid, 10))); } db.getSortedSetRange('uid:' + uid + ':blocked_uids', 0, -1, function (err, blocked) { From 7cd8274c0f99fa6173e75351a5738913880a24a8 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Sun, 1 Jul 2018 22:11:38 -0600 Subject: [PATCH 003/310] Add series flag for `./nodebb build` --- src/cli/index.js | 5 +++-- src/meta/build.js | 12 ++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cli/index.js b/src/cli/index.js index cece70d554..20f7c85271 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -186,8 +186,9 @@ program program .command('build [targets...]') .description('Compile static assets ' + '(JS, CSS, templates, languages, sounds)'.red) - .action(function (targets) { - require('./manage').build(targets.length ? targets : true); + .option('-s, --series', 'Run builds in series without extra processes') + .action(function (targets, options) { + require('./manage').build(targets.length ? targets : true, options); }) .on('--help', function () { require('./manage').buildTargets(); diff --git a/src/meta/build.js b/src/meta/build.js index 62399ec2e7..62288dad3a 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -134,13 +134,22 @@ function buildTargets(targets, parallel, callback) { }, callback); } -function build(targets, callback) { +function build(targets, options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } else if (!options) { + options = {}; + } + if (targets === true) { targets = allTargets; } else if (!Array.isArray(targets)) { targets = targets.split(','); } + var parallel = !nconf.get('series') && !options.series; + targets = targets // get full target name .map(function (target) { @@ -200,7 +209,6 @@ function build(targets, callback) { require('./minifier').maxThreads = threads - 1; } - var parallel = !nconf.get('series'); if (parallel) { winston.info('[build] Building in parallel mode'); } else { From 65b4bafb161ed078b3a018981b1168164d4c5f67 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Mon, 2 Jul 2018 18:09:21 -0600 Subject: [PATCH 004/310] Fix @scoped themes --- src/meta/css.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/meta/css.js b/src/meta/css.js index cf39d5f8f6..5762c2cf1c 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -89,6 +89,7 @@ function getImports(files, prefix, extension, callback) { function getBundleMetadata(target, callback) { var paths = [ path.join(__dirname, '../../node_modules'), + path.join(__dirname, '../../public/less'), path.join(__dirname, '../../public/vendor/fontawesome/less'), ]; From b02e918220491fba0de0078bd207f60fc7eda406 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 6 Jul 2018 17:37:08 +0000 Subject: [PATCH 005/310] Update node:8.11.3 Docker digest to 38953a --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 4e57b64b9b..614e778003 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # The base image is the latest 8.x node (LTS) -FROM node:8.11.3@sha256:625d0b446f63b2d051c7b2a468f6cee63536dec716f09afcf9ae1c575d9b953a +FROM node:8.11.3@sha256:38953a117b8f794426429314126af19ff17bbfaa5449c1829b9a8412b8ef4536 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app From cc6a683bc412a71d03029d50cc9c6ac717875922 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 6 Jul 2018 14:20:10 -0400 Subject: [PATCH 006/310] closes #6631 --- src/controllers/home.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/controllers/home.js b/src/controllers/home.js index 35a6cfe6a0..49cee7e192 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -1,6 +1,8 @@ 'use strict'; var async = require('async'); +var url = require('url'); + var plugins = require('../plugins'); var meta = require('../meta'); var user = require('../user'); @@ -18,7 +20,7 @@ function getUserHomeRoute(uid, callback) { var route = adminHomePageRoute(); if (settings.homePageRoute !== 'undefined' && settings.homePageRoute !== 'none') { - route = settings.homePageRoute || route; + route = (settings.homePageRoute || route).replace(/^\/+/, ''); } next(null, route); @@ -40,14 +42,22 @@ function rewrite(req, res, next) { } }, function (route, next) { - var hook = 'action:homepage.get:' + route; - - if (!plugins.hasListeners(hook)) { - req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + route; - } else { - res.locals.homePageRoute = route; + var parsedUrl; + try { + parsedUrl = url.parse(route, true); + } catch (err) { + return next(err); } + var pathname = parsedUrl.pathname; + var hook = 'action:homepage.get:' + pathname; + if (!plugins.hasListeners(hook)) { + req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname; + } else { + res.locals.homePageRoute = pathname; + } + req.query = Object.assign(parsedUrl.query, req.query); + next(); }, ], next); From 16a7728ab84812cabde7b8a806de034d583d60c6 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 6 Jul 2018 14:20:37 -0400 Subject: [PATCH 007/310] fix redis warnings --- src/database/redis/hash.js | 5 ++++- src/socket.io/admin/categories.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js index 9dd6276f88..3055143375 100644 --- a/src/database/redis/hash.js +++ b/src/database/redis/hash.js @@ -14,7 +14,7 @@ module.exports = function (redisClient, module) { } Object.keys(data).forEach(function (key) { - if (data[key] === undefined) { + if (data[key] === undefined || data[key] === null) { delete data[key]; } }); @@ -26,6 +26,9 @@ module.exports = function (redisClient, module) { module.setObjectField = function (key, field, value, callback) { callback = callback || function () {}; + if (!field) { + return callback(); + } redisClient.hset(key, field, value, function (err) { callback(err); }); diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 6ccc20c873..d35a582691 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -85,7 +85,7 @@ Categories.setPrivilege = function (socket, data, callback) { events.log({ uid: socket.uid, ip: socket.ip, - privilege: data.privilege, + privilege: data.privilege.toString(), action: data.set ? 'grant' : 'rescind', target: data.member, }, callback); From e56d20feda06ab37f76457c4561ac4dd27379546 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 9 Jul 2018 09:29:02 +0000 Subject: [PATCH 008/310] Latest translations and fallbacks --- public/language/ro/login.json | 2 +- public/language/ro/recent.json | 4 ++-- public/language/ro/tags.json | 2 +- public/language/ro/users.json | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/language/ro/login.json b/public/language/ro/login.json index 1f3e72b093..3f4ea88e35 100644 --- a/public/language/ro/login.json +++ b/public/language/ro/login.json @@ -8,5 +8,5 @@ "failed_login_attempt": "Login nereușit", "login_successful": "Te-ai autentificat cu succes!", "dont_have_account": "Nu ai un cont?", - "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity" + "logged-out-due-to-inactivity": "Ai fost deconectat din panoul de administrare din cauza inactivității" } \ No newline at end of file diff --git a/public/language/ro/recent.json b/public/language/ro/recent.json index 45d788dfc3..ad7867e068 100644 --- a/public/language/ro/recent.json +++ b/public/language/ro/recent.json @@ -9,11 +9,11 @@ "no_popular_topics": "Nu sunt subiecte populare.", "there-is-a-new-topic": "Există un subiect nou.", "there-is-a-new-topic-and-a-new-post": "Există un subiect nou si o postare nouă.", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", + "there-is-a-new-topic-and-new-posts": "Există un subiect nou și %1 postări noi.", "there-are-new-topics": "Există %1 postări noi.", "there-are-new-topics-and-a-new-post": "Exista %1 subiect nou și o postare nouă", "there-are-new-topics-and-new-posts": "Exista %1 subiecte noi și %2 postări noi", "there-is-a-new-post": "Exista o postare nouă", "there-are-new-posts": "Există %1 postări noi", - "click-here-to-reload": "Click here to reload." + "click-here-to-reload": "Apăsaţi aici pentru a reîncărca." } \ No newline at end of file diff --git a/public/language/ro/tags.json b/public/language/ro/tags.json index 59edbb0063..f3cd74e98f 100644 --- a/public/language/ro/tags.json +++ b/public/language/ro/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Nu există nici un subiect cu acest tag.", "tags": "Taguri", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Introduceți tagurile aici, fiecare tag trebuie să conțină între %1 și %2 caractere.", "enter_tags_here_short": "Introdu taguri...", "no_tags": "În acest moment nu există nici un tag." } \ No newline at end of file diff --git a/public/language/ro/users.json b/public/language/ro/users.json index d3a4f09a9e..8dcd1a7b94 100644 --- a/public/language/ro/users.json +++ b/public/language/ro/users.json @@ -2,20 +2,20 @@ "latest_users": "Ultimii Utilizatori", "top_posters": "Top Utilizatori", "most_reputation": "Cei mai apreciați utilizatori", - "most_flags": "Most Flags", + "most_flags": "Cele mai multe flaguri", "search": "Căutare", "enter_username": "Introdu un nume de utilizator pentru a căuta", "load_more": "Încarcă mai multe", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "filter-by": "Filter By", + "users-found-search-took": "%1 utilizator(i) găsiți! Căutarea a durat %2 secunde.", + "filter-by": "Filtrează după", "online-only": "Numai online", "invite": "Invită", - "invitation-email-sent": "An invitation email has been sent to %1", + "invitation-email-sent": "Un email de invitație s-a trimis la %1", "user_list": "Listă utilizatori", "recent_topics": "Subiecte Noi", "popular_topics": "Subiecte Populare", "unread_topics": "Subiecte Necitite", "categories": "Categorii", "tags": "Taguri", - "no-users-found": "No users found!" + "no-users-found": "Niciun utilizator găsit!" } \ No newline at end of file From cfb97845270162119c790b94017952f42a5a4eff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Jul 2018 14:26:21 -0400 Subject: [PATCH 009/310] closes #6641 --- public/language/en-GB/email.json | 3 ++ src/user/email.js | 8 +++-- src/user/profile.js | 2 ++ src/views/emails/verify_email.tpl | 53 +++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/views/emails/verify_email.tpl diff --git a/public/language/en-GB/email.json b/public/language/en-GB/email.json index 8351cfcd10..378dd84b38 100644 --- a/public/language/en-GB/email.json +++ b/public/language/en-GB/email.json @@ -7,6 +7,9 @@ "greeting_no_name": "Hello", "greeting_with_name": "Hello %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", + "welcome.text1": "Thank you for registering with %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/src/user/email.js b/src/user/email.js index 598536ad29..24559104a3 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -100,14 +100,16 @@ UserEmail.sendValidationEmail = function (uid, options, callback) { }, function (username, next) { var title = meta.config.title || meta.config.browserTitle || 'NodeBB'; - translator.translate('[[email:welcome-to, ' + title + ']]', meta.config.defaultLang, function (subject) { + var subject = options.subject || '[[email:welcome-to, ' + title + ']]'; + var template = options.template || 'welcome'; + translator.translate(subject, meta.config.defaultLang, function (subject) { var data = { username: username, confirm_link: confirm_link, confirm_code: confirm_code, subject: subject, - template: 'welcome', + template: template, uid: uid, }; @@ -115,7 +117,7 @@ UserEmail.sendValidationEmail = function (uid, options, callback) { plugins.fireHook('action:user.verify', { uid: uid, data: data }); next(); } else { - emailer.send('welcome', uid, data, next); + emailer.send(template, uid, data, next); } }); }, diff --git a/src/user/profile.js b/src/user/profile.js index 5da6eb7409..2849fbde1a 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -223,6 +223,8 @@ module.exports = function (User) { if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && newEmail) { User.email.sendValidationEmail(uid, { email: newEmail, + subject: '[[email:email.verify-your-email.subject]]', + template: 'verify_email', }); } User.setUserField(uid, 'email:confirmed', 0, next); diff --git a/src/views/emails/verify_email.tpl b/src/views/emails/verify_email.tpl new file mode 100644 index 0000000000..1a061786cb --- /dev/null +++ b/src/views/emails/verify_email.tpl @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + +
+

[[email:verify.text1]]

+

[[email:welcome.text2]]

+
+ + + + + +
+ +     [[email:welcome.cta]]     + +
+ +
+

[[email:closing]]

+

{site_title}

+
+
+ + + From 85a55d1740dbbb224cd4aa0e5974cf0650fcd06e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Jul 2018 14:57:42 -0400 Subject: [PATCH 010/310] closes --- public/language/en-GB/admin/settings/uploads.json | 2 ++ src/middleware/index.js | 8 +++++++- src/views/admin/settings/uploads.tpl | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/public/language/en-GB/admin/settings/uploads.json b/public/language/en-GB/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/en-GB/admin/settings/uploads.json +++ b/public/language/en-GB/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/src/middleware/index.js b/src/middleware/index.js index 0173ecb3c6..5c58771282 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -145,8 +145,14 @@ middleware.privateUploads = function (req, res, next) { if (req.loggedIn || parseInt(meta.config.privateUploads, 10) !== 1) { return next(); } + if (req.path.startsWith(nconf.get('relative_path') + '/assets/uploads/files')) { - return res.status(403).json('not-allowed'); + var extensions = (meta.config.privateUploadsExtensions || '').split(',').filter(Boolean); + var ext = path.extname(req.path); + ext = ext ? ext.replace(/^\./, '') : ext; + if (!extensions.length || extensions.includes(ext)) { + return res.status(403).json('not-allowed'); + } } next(); }; diff --git a/src/views/admin/settings/uploads.tpl b/src/views/admin/settings/uploads.tpl index e523c928c5..34d7f96771 100644 --- a/src/views/admin/settings/uploads.tpl +++ b/src/views/admin/settings/uploads.tpl @@ -20,6 +20,14 @@ +
+ + +

+ [[admin/settings/uploads:private-uploads-extensions-help]] +

+
+
From 91f9c60660c2d11d3416f0af7419021604f4bead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Jul 2018 12:14:12 -0400 Subject: [PATCH 011/310] closes #6643 --- src/user/blocks.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/user/blocks.js b/src/user/blocks.js index e2689d8df9..51bb4520f1 100644 --- a/src/user/blocks.js +++ b/src/user/blocks.js @@ -73,8 +73,8 @@ module.exports = function (User) { async.apply(db.sortedSetAdd.bind(db), 'uid:' + uid + ':blocked_uids', Date.now(), targetUid), async.apply(User.incrementUserFieldBy, uid, 'blocksCount', 1), function (_blank, next) { - User.blocks._cache.del(uid); - pubsub.publish('user:blocks:cache:del', uid); + User.blocks._cache.del(parseInt(uid, 10)); + pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); setImmediate(next); }, ], callback); @@ -86,8 +86,8 @@ module.exports = function (User) { async.apply(db.sortedSetRemove.bind(db), 'uid:' + uid + ':blocked_uids', targetUid), async.apply(User.decrementUserFieldBy, uid, 'blocksCount', 1), function (_blank, next) { - User.blocks._cache.del(uid); - pubsub.publish('user:blocks:cache:del', uid); + User.blocks._cache.del(parseInt(uid, 10)); + pubsub.publish('user:blocks:cache:del', parseInt(uid, 10)); setImmediate(next); }, ], callback); From d0c22c5bd3d8838e6fdac2f2920a3be6ecb94ff3 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 11 Jul 2018 09:29:19 +0000 Subject: [PATCH 012/310] Latest translations and fallbacks --- public/language/nl/admin/settings/email.json | 54 ++++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/public/language/nl/admin/settings/email.json b/public/language/nl/admin/settings/email.json index 50ad2e06ea..fa93b5f502 100644 --- a/public/language/nl/admin/settings/email.json +++ b/public/language/nl/admin/settings/email.json @@ -1,37 +1,37 @@ { "email-settings": "Email Settings", - "address": "Email Address", - "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", - "from": "From Name", - "from-help": "The from name to display in the email.", + "address": "E-mailAdres", + "address-help": "Het volgende e-mailadres refereert aan de e-mail die ontvanger ziet in de \"From\" en \"Reply To\" velden.", + "from": "From Naam", + "from-help": "De from naam om te tonen in de e-mail.", "smtp-transport": "SMTP Transport", - "smtp-transport.enabled": "Use an external email server to send emails", - "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", - "smtp-transport.service": "Select a service", + "smtp-transport.enabled": "Gebruik een externe mail server om mails te verzenden", + "smtp-transport-help": "Je kunt een bekende dienst uit de lijst selecteren of vul een aangepaste dienst in.", + "smtp-transport.service": "Selecteer een dienst", "smtp-transport.service-custom": "Custom Service", - "smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.", - "smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", - "smtp-transport.gmail-warning2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", + "smtp-transport.service-help": "Selecteer een dienst naam hierboven om de bekende gegevens ervan te gebruiken of selecteer 'Custom Service' en voer de details hieronder in.", + "smtp-transport.gmail-warning1": "Er zijn meldingen dat de Gmail service niet werkt op accounts met verhoogde beveiliging. In die gevallen zul je je GMail account moeten configureren om minder veilige apps toe te staan.", + "smtp-transport.gmail-warning2": "Voor meer informatie over deze workaround e information about this workaround, please consult this NodeMailer article on the issue. Een alternatief zou zijn om een emailer plugin van derde partij te gebruiken, zoals SendGrid, Mailgun, etc. Browse available plugins here.", "smtp-transport.host": "SMTP Host", - "smtp-transport.port": "SMTP Port", + "smtp-transport.port": "SMTP Poort", "smtp-transport.security": "Connection security", - "smtp-transport.security-encrypted": "Encrypted", + "smtp-transport.security-encrypted": "Versleuteld", "smtp-transport.security-starttls": "StartTLS", - "smtp-transport.security-none": "None", - "smtp-transport.username": "Username", - "smtp-transport.username-help": "For the Gmail service, enter the full email address here, especially if you are using a Google Apps managed domain.", - "smtp-transport.password": "Password", + "smtp-transport.security-none": "Geen", + "smtp-transport.username": "Gebruikersnaam", + "smtp-transport.username-help": "For the Gmail service, voer het volledige email adres in, in het bijzonder als je gebruik maakt van een Google Apps managed domain.", + "smtp-transport.password": "Wachtwoord", - "template": "Edit Email Template", - "template.select": "Select Email Template", - "template.revert": "Revert to Original", - "testing": "Email Testing", - "testing.select": "Select Email Template", - "testing.send": "Send Test Email", - "testing.send-help": "The test email will be sent to the currently logged in user's email address.", - "subscriptions": "Email Subscriptions", - "subscriptions.disable": "Disable subscriber notification emails", - "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " + "template": "Aanpassen E-mail Template", + "template.select": "Selecteer E-mail Template", + "template.revert": "Veranderingen ongedaan maken", + "testing": "E-mail Testen", + "testing.select": "Selecteer E-mail Template", + "testing.send": "Verzend Test E-mail", + "testing.send-help": "De test mail zal worden verstuurd naar het email adres van de op dit moment ingelogde gebruiker.", + "subscriptions": "E-mail abonnementen", + "subscriptions.disable": "Schakel subscriber notificatie e-mails uit", + "subscriptions.hour": "Uur van Digest", + "subscriptions.hour-help": "Voer het nummer in dat het uur representeerd waarop scheduled email digests worden verstuurd (bv. 0 voor middernacht, 17 voor 17:00). Neem er s.v.p. notie van dat dit het uur is van de server self, dit hoeft niet exact overeen te komen met de klok van uw systeem.
De tijd op de server is bij benadering:
De volgende dagelijkse digest staat gepland om " } \ No newline at end of file From 7558046e757640e99614aa88df4998bdb362d16b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Jul 2018 16:28:33 -0400 Subject: [PATCH 013/310] add brute-force protection for change password and email actions --- src/user/password.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/user/password.js b/src/user/password.js index d644fd2e8f..bf39d029d0 100644 --- a/src/user/password.js +++ b/src/user/password.js @@ -33,7 +33,16 @@ module.exports = function (User) { function (next) { Password.compare(password, hashedPassword, next); }, - ], callback); + ], function (err, ok) { + if (err) { + return callback(err); + } + + // Delay return for incorrect current password + setTimeout(function () { + callback(null, ok); + }, ok ? 0 : 2500); + }); }; User.hasPassword = function (uid, callback) { From 53c535063f339b51eeecc48304892a7087d42358 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 13 Jul 2018 13:23:58 -0400 Subject: [PATCH 014/310] Update package.json Bump emoji plugin --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 8987f8430c..e29846770c 100644 --- a/install/package.json +++ b/install/package.json @@ -67,7 +67,7 @@ "nconf": "^0.10.0", "nodebb-plugin-composer-default": "6.0.29", "nodebb-plugin-dbsearch": "2.0.19", - "nodebb-plugin-emoji": "^2.2.2", + "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.4.4", "nodebb-plugin-mentions": "2.2.8", @@ -145,4 +145,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} From 9d005fa2030a851c68fa269c63a86f5ca20ea579 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 14 Jul 2018 09:28:46 +0000 Subject: [PATCH 015/310] Latest translations and fallbacks --- public/language/lt/flags.json | 16 +++++----- public/language/lt/groups.json | 4 +-- public/language/lt/pages.json | 4 +-- public/language/lt/topic.json | 22 ++++++------- public/language/lt/user.json | 32 +++++++++---------- .../language/tr/admin/manage/privileges.json | 14 ++++---- public/language/tr/admin/manage/users.json | 2 +- 7 files changed, 47 insertions(+), 47 deletions(-) diff --git a/public/language/lt/flags.json b/public/language/lt/flags.json index 35fc87011a..a278900a1d 100644 --- a/public/language/lt/flags.json +++ b/public/language/lt/flags.json @@ -5,8 +5,8 @@ "description": "Description", "no-flags": "Hooray! No flags found.", "assignee": "Assignee", - "update": "Update", - "updated": "Updated", + "update": "Atnaujinti", + "updated": "Atnaujinta", "target-purged": "The content this flag referred to has been purged and is no longer available.", "quick-filters": "Quick Filters", @@ -16,9 +16,9 @@ "filter-reporterId": "Reporter UID", "filter-targetUid": "Flagged UID", "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-type-user": "User", + "filter-type-all": "Visas turinys", + "filter-type-post": "Pranešimas", + "filter-type-user": "Vartotojas", "filter-state": "State", "filter-assignee": "Assignee UID", "filter-cid": "Category", @@ -47,13 +47,13 @@ "state-open": "New/Open", "state-wip": "Work in Progress", "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", + "state-rejected": "Atmesta", + "no-assignee": "Nepriskirta", "note-added": "Note Added", "modal-title": "Report Inappropriate Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", - "modal-reason-spam": "Spam", + "modal-reason-spam": "Šlamštas", "modal-reason-offensive": "Offensive", "modal-reason-other": "Other (specify below)", "modal-reason-custom": "Reason for reporting this content...", diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index 2f116d8040..f1cf729572 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -27,7 +27,7 @@ "details.disableJoinRequests": "Disable join requests", "details.grant": "Duoti/Atšaukti Nuosavybę", "details.kick": "Išmesti", - "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.kick_confirm": "Ar tikrai šį narį norite pašalinti iš grupės?", "details.owner_options": "Grupės Administratorius", "details.group_name": "Grupės pavadinimas", "details.member_count": "Narių skaičiuotuvas", @@ -50,7 +50,7 @@ "membership.join-group": "Prisijungti Prie Grupės", "membership.leave-group": "Palikti Grupę", "membership.reject": "Atšaukti", - "new-group.group_name": "Group Name:", + "new-group.group_name": "Grupės pavadinimas:", "upload-group-cover": "Upload group cover", "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", "bulk-invite": "Bulk Invite", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 3d02ab95b1..029d375dcc 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -30,7 +30,7 @@ "group": "%1 grupė", "chats": "Susirašinėjimai", "chat": "Susirašinėja su %1", - "flags": "Flags", + "flags": "Vėliavos", "flag-details": "Flag %1 Details", "account/edit": "Redaguoja \"%1\"", "account/edit/password": "Redaguoja \"%1\" slaptažodį", @@ -48,7 +48,7 @@ "account/ignored": "Temos ignoruojamos %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", + "account/best": "Geriausi pranešimai, kuriuos parašė %1", "account/blocks": "Užblokuoti vartotojai dėl %1", "account/uploads": "%1 Įkėlimai", "confirm": "El. paštas patvirtintas", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 45b57d8992..814de911d4 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -13,9 +13,9 @@ "notify_me": "Gauti pranešimus apie naujus atsakymus šioje temoje", "quote": "Cituoti", "reply": "Atsakyti", - "replies_to_this_post": "%1 Replies", - "one_reply_to_this_post": "1 Reply", - "last_reply_time": "Last reply", + "replies_to_this_post": "%1 atsakymai", + "one_reply_to_this_post": "1 Atsakymas", + "last_reply_time": "Paskutinis atsakymas", "reply-as-topic": "Reply as topic", "guest-login-reply": "Norėdami atsakyti, prisijunkite", "edit": "Redaguoti", @@ -29,9 +29,9 @@ "tools": "Įrankiai", "locked": "Užrakinta", "pinned": "Pinned", - "moved": "Moved", + "moved": "Perkelta", "copy-ip": "Copy IP", - "ban-ip": "Ban IP", + "ban-ip": "Blokuoti IP", "view-history": "Edit History", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Pažymėti ši pranešimą moderatoriams", @@ -43,15 +43,15 @@ "login_to_subscribe": "Norėdami prenumeruoti šią temą, prašome prisiregistruoti arba prisijungti.", "markAsUnreadForAll.success": "Tema visiems vartotojams pažymėta kaip neskaityta.", "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Tema pažymėta kaip neskaityta.", "watch": "Žiūrėti", "unwatch": "Nebesekti", "watch.title": "Gauti pranešimą apie naujus įrašus šioje temoje", "unwatch.title": "Baigti šios temos stebėjimą", "share_this_post": "Dalintis šiuo įrašu", - "watching": "Watching", + "watching": "Stebima", "not-watching": "Not Watching", - "ignoring": "Ignoring", + "ignoring": "Ignoruojama", "watching.description": "Notify me of new replies.
Show topic in unread.", "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", @@ -118,11 +118,11 @@ "sort_by": "Rūšiuoti pagal", "oldest_to_newest": "Nuo seniausių iki naujausių", "newest_to_oldest": "Nuo naujausių iki seniausių", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "Daugiausiai Balsų", + "most_posts": "Daugiausiai Įrašų", "stale.title": "Create new topic instead?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", + "stale.create": "Sukurti naują temą", "stale.reply_anyway": "Reply to this topic anyway", "link_back": "Re: [%1](%2)", "diffs.title": "Post Edit History", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 5b02a51654..3ea331865b 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -1,7 +1,7 @@ { "banned": "Užblokuotas", "offline": "Atsijungęs", - "deleted": "Deleted", + "deleted": "Ištrinti", "username": "Vartotojo vardas", "joindate": "Prisijungimo data", "postcount": "Įrašų kiekis", @@ -24,9 +24,9 @@ "profile": "Profilis", "profile_views": "Profilio peržiūros", "reputation": "Reputacija", - "bookmarks": "Bookmarks", + "bookmarks": "Žymės", "watched": "Peržiūrėjo", - "ignored": "Ignored", + "ignored": "Ignoruojami", "followers": "Sekėjai", "following": "Seka", "blocks": "Blocks", @@ -35,8 +35,8 @@ "signature": "Parašas", "birthday": "Gimimo diena", "chat": "Susirašinėti", - "chat_with": "Continue chat with %1", - "new_chat_with": "Start new chat with %1", + "chat_with": "Tęsti pokalbį su %1", + "new_chat_with": "Pradėti naują susirašinėjimą su %1", "flag-profile": "Flag Profile", "follow": "Sekti", "unfollow": "Nesekti", @@ -63,14 +63,14 @@ "username_taken_workaround": "Jūsų norimas vartotojo vardas jau užimtas, todėl mes jį šiek tiek pakeitėme. Dabar jūs esate žinomas kaip %1", "password_same_as_username": "Jūsų slaptažodis sutampa su Jūsų vartotojo vardu. Dėl saugumo, prašome naudoti kitą slaptažodį.", "password_same_as_email": "Jūsų slaptažodis sutampa su Jūsų el. pašto adresu. Dėl saugumo, prašome naudoti kitą slaptažodį.", - "weak_password": "Weak password.", + "weak_password": "Silpnas slaptažodis.", "upload_picture": "Įkelti paveikslėlį", "upload_a_picture": "Įkelti paveikslėlį", "remove_uploaded_picture": "Ištrinti paveikslėlį", "upload_cover_picture": "Įkelti viršelio nuotrauką", "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", - "crop_picture": "Crop picture", - "upload_cropped_picture": "Crop and upload", + "crop_picture": "Apkarpyti paveikslėlį", + "upload_cropped_picture": "Apkarpyti ir įkelti", "settings": "Nustatymai", "show_email": "Rodyti mano el. paštą viešai", "show_fullname": "Rodyti mano vardą ir pavardę", @@ -98,7 +98,7 @@ "topics_per_page": "Temų puslapyje", "posts_per_page": "Pranešimų puslapyje", "max_items_per_page": "Maximum %1", - "acp_language": "Admin Page Language", + "acp_language": "Administratoriaus puslapio kalba", "notification_sounds": "Paleisti garsą kai jūs gaunate pranešimą", "notifications_and_sounds": "Pranešimai ir garsai", "incoming-message-sound": "Gaunamos žinutės garsas", @@ -142,28 +142,28 @@ "info.banned-reason-label": "Priežastis", "info.banned-no-reason": "Be priežasties", "info.username-history": "Username History", - "info.email-history": "Email History", + "info.email-history": "El. pašto istorija", "info.moderation-note": "Moderation Note", "info.moderation-note.success": "Moderation note saved", - "info.moderation-note.add": "Add note", + "info.moderation-note.add": "Pridėti pastabą", "consent.title": "Your Rights & Consent", - "consent.lead": "This community forum collects and processes your personal information.", + "consent.lead": "Šis bendruomenės forumas renka ir apdoroja jūsų asmeninę informaciją.", "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", - "consent.give": "Give consent", - "consent.right_of_access": "You have the Right of Access", + "consent.give": "Duoti sutikimą", + "consent.right_of_access": "Jūs turite prieigos teisę", "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", "consent.right_to_rectification": "You have the Right to Rectification", "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", "consent.right_to_erasure": "You have the Right to Erasure", "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", + "consent.right_to_data_portability": "Turite teisę į duomenų perkėlimą", "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", - "consent.export_profile": "Export Profile (.csv)", + "consent.export_profile": "Eksportuoti profilį (.csv)", "consent.export_uploads": "Export Uploaded Content (.zip)", "consent.export_posts": "Export Posts (.csv)" } \ No newline at end of file diff --git a/public/language/tr/admin/manage/privileges.json b/public/language/tr/admin/manage/privileges.json index eddca6d5b6..ad1460e278 100644 --- a/public/language/tr/admin/manage/privileges.json +++ b/public/language/tr/admin/manage/privileges.json @@ -2,16 +2,16 @@ "global": "Global", "global.no-users": "No user-specific global privileges.", - "chat": "Chat", - "upload-images": "Upload Images", - "upload-files": "Upload Files", - "signature": "Signature", + "chat": "Sohbet", + "upload-images": "Resim Yükle", + "upload-files": "Dosya Yükle", + "signature": "İmza", "ban": "Ban", "search-content": "Search Content", - "search-users": "Search Users", - "search-tags": "Search Tags", + "search-users": "Kullanıcıları Ara", + "search-tags": "Etiketleri Ara", - "find-category": "Find Category", + "find-category": "Kategori Bul", "access-category": "Access Category", "access-topics": "Access Topics", "create-topics": "Create Topics", diff --git a/public/language/tr/admin/manage/users.json b/public/language/tr/admin/manage/users.json index 2df6499374..0eca542d41 100644 --- a/public/language/tr/admin/manage/users.json +++ b/public/language/tr/admin/manage/users.json @@ -58,7 +58,7 @@ "create.password-confirm": "Parolayı Onayla", "temp-ban.length": "Yasaklama uzunluğu", - "temp-ban.reason": "Reason (Optional)", + "temp-ban.reason": "Sebep(İsteğe Bağlı)", "temp-ban.hours": "Saat", "temp-ban.days": "Gün", "temp-ban.explanation": "Yasağın süresini girin. 0'lık bir zamanın kalıcı bir yasak olarak sayılacağını unutmayın.", From 04d31fe1d4f09fef60ee0c07a3982d30fd12992c Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Sun, 15 Jul 2018 00:12:37 -0600 Subject: [PATCH 016/310] Precompile all templates - Benchpress compilation is 33x faster now - Native module with JS fallback and pre-built binaries - Dev template build is <1sec now - Minified template build is ~5sec (uglify accounts for almost all) --- install/package.json | 2 +- src/emailer.js | 24 +++++++++-------- src/meta/templates.js | 47 +++++++++++++++++++++++++++++++-- src/middleware/index.js | 57 ----------------------------------------- src/routes/index.js | 1 - src/webserver.js | 10 +------- test/controllers.js | 6 +++-- 7 files changed, 65 insertions(+), 82 deletions(-) diff --git a/install/package.json b/install/package.json index e29846770c..5db98b4e62 100644 --- a/install/package.json +++ b/install/package.json @@ -22,7 +22,7 @@ "async": "2.6.1", "autoprefixer": "^8.5.2", "bcryptjs": "2.4.3", - "benchpressjs": "^1.2.2", + "benchpressjs": "^1.2.3", "body-parser": "^1.18.2", "bootstrap": "^3.3.7", "chart.js": "^2.7.1", diff --git a/src/emailer.js b/src/emailer.js index 184eb5d95b..6b74158b22 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -289,22 +289,26 @@ Emailer.sendViaFallback = function (data, callback) { function buildCustomTemplates(config) { async.waterfall([ function (next) { - Emailer.getTemplates(config, next); + async.parallel({ + templates: function (cb) { + Emailer.getTemplates(config, cb); + }, + paths: function (cb) { + file.walk(viewsDir, cb); + }, + }, next); }, - function (templates, next) { - templates = templates.filter(function (template) { + function (result, next) { + var templates = result.templates.filter(function (template) { return template.isCustom && template.text !== prevConfig['email:custom:' + path]; }); + var paths = _.fromPairs(result.paths.map(function (p) { + var relative = path.relative(viewsDir, p).replace(/\\/g, '/'); + return [relative, p]; + })); async.each(templates, function (template, next) { async.waterfall([ function (next) { - file.walk(viewsDir, next); - }, - function (paths, next) { - paths = _.fromPairs(paths.map(function (p) { - var relative = path.relative(viewsDir, p).replace(/\\/g, '/'); - return [relative, p]; - })); meta.templates.processImports(paths, template.path, template.text, next); }, function (source, next) { diff --git a/src/meta/templates.js b/src/meta/templates.js index 1ccf14c8e3..11635dcb50 100644 --- a/src/meta/templates.js +++ b/src/meta/templates.js @@ -8,6 +8,7 @@ var path = require('path'); var fs = require('fs'); var nconf = require('nconf'); var _ = require('lodash'); +var Benchpress = require('benchpressjs'); var plugins = require('../plugins'); var file = require('../file'); @@ -113,6 +114,34 @@ function getTemplateFiles(dirs, callback) { ], callback); } +function compileTemplate(filename, source, callback) { + async.waterfall([ + function (next) { + file.walk(viewsPath, next); + }, + function (paths, next) { + paths = _.fromPairs(paths.map(function (p) { + var relative = path.relative(viewsPath, p).replace(/\\/g, '/'); + return [relative, p]; + })); + async.waterfall([ + function (next) { + processImports(paths, filename, source, next); + }, + function (source, next) { + Benchpress.precompile(source, { + minify: global.env !== 'development', + }, next); + }, + function (compiled, next) { + fs.writeFile(path.join(viewsPath, filename.replace(/\.tpl$/, '.js')), compiled, next); + }, + ], next); + }, + ], callback); +} +Templates.compileTemplate = compileTemplate; + function compile(callback) { callback = callback || function () {}; @@ -144,8 +173,22 @@ function compile(callback) { next(err, source); }); }, - function (compiled, next) { - fs.writeFile(path.join(viewsPath, name), compiled, next); + function (imported, next) { + async.parallel([ + function (cb) { + fs.writeFile(path.join(viewsPath, name), imported, cb); + }, + function (cb) { + Benchpress.precompile(imported, { minify: global.env !== 'development' }, function (err, compiled) { + if (err) { + cb(err); + return; + } + + fs.writeFile(path.join(viewsPath, name.replace(/\.tpl$/, '.js')), compiled, cb); + }); + }, + ], next); }, ], next); }, next); diff --git a/src/middleware/index.js b/src/middleware/index.js index 5c58771282..5eba1ed3dc 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -2,13 +2,11 @@ var async = require('async'); var path = require('path'); -var fs = require('fs'); var csrf = require('csurf'); var validator = require('validator'); var nconf = require('nconf'); var ensureLoggedIn = require('connect-ensure-login'); var toobusy = require('toobusy-js'); -var Benchpress = require('benchpressjs'); var LRU = require('lru-cache'); var plugins = require('../plugins'); @@ -207,58 +205,3 @@ middleware.delayLoading = function (req, res, next) { setTimeout(next, 1000); }; - -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(); - } - var tplPath = filePath.replace(/\.js$/, '.tpl'); - if (workingCache[filePath]) { - workingCache[filePath].push(next); - return; - } - - async.waterfall([ - function (cb) { - file.exists(filePath, cb); - }, - function (exists, cb) { - if (exists) { - 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(tplPath, 'utf8', cb); - }, - function (source, cb) { - Benchpress.precompile({ - source: source, - minify: global.env !== 'development', - }, cb); - }, - function (compiled, cb) { - if (!compiled) { - return cb(new Error('[[error:templatesOnDemand.compiled-template-empty, ' + tplPath + ']]')); - } - fs.writeFile(filePath, compiled, cb); - }, - ], function (err) { - var arr = workingCache[filePath]; - workingCache[filePath] = null; - - arr.forEach(function (callback) { - callback(err); - }); - }); -}; diff --git a/src/routes/index.js b/src/routes/index.js index 0b5b37c7b2..1d5d4fe1ee 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -152,7 +152,6 @@ module.exports = function (app, middleware, hotswapIds, callback) { } app.use(middleware.privateUploads); - app.use(relativePath + '/assets/templates', middleware.templatesOnDemand); var statics = [ { route: '/assets', path: path.join(__dirname, '../../build/public') }, diff --git a/src/webserver.js b/src/webserver.js index be4c02f443..86a84a1459 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -147,15 +147,7 @@ function setupExpressApp(app, callback) { app.engine('tpl', function (filepath, data, next) { filepath = filepath.replace(/\.tpl$/, '.js'); - middleware.templatesOnDemand({ - filePath: filepath, - }, null, function (err) { - if (err) { - return next(err); - } - - Benchpress.__express(filepath, data, next); - }); + Benchpress.__express(filepath, data, next); }); app.set('view engine', 'tpl'); app.set('views', viewsDir); diff --git a/test/controllers.js b/test/controllers.js index 2104fc3230..65ec3c6b91 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -72,15 +72,17 @@ describe('Controllers', function () { }); } var message = utils.generateUUID(); - var tplPath = path.join(nconf.get('views_dir'), 'custom.tpl'); + var name = 'custom.tpl'; + var tplPath = path.join(nconf.get('views_dir'), name); - before(function () { + before(function (done) { plugins.registerHook('myTestPlugin', { hook: 'action:homepage.get:custom', method: hookMethod, }); fs.writeFileSync(tplPath, message); + meta.templates.compileTemplate(name, message, done); }); it('should load default', function (done) { From c6a710954fb596b96f1d679a90fd2a3e6875ad95 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 15 Jul 2018 09:28:36 +0000 Subject: [PATCH 017/310] Latest translations and fallbacks --- public/language/es/admin/manage/privileges.json | 8 ++++---- public/language/es/admin/settings/advanced.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/language/es/admin/manage/privileges.json b/public/language/es/admin/manage/privileges.json index 8f109d2e36..16573b703c 100644 --- a/public/language/es/admin/manage/privileges.json +++ b/public/language/es/admin/manage/privileges.json @@ -7,8 +7,8 @@ "upload-files": "Subir Archivos", "signature": "Firma", "ban": "Banear", - "search-content": "Buscar contenido", - "search-users": "Buscar usuarios", + "search-content": "Buscar Contenido", + "search-users": "Buscar Usuarios", "search-tags": "Buscar Tags", "find-category": "Buscar Categoría", @@ -17,10 +17,10 @@ "create-topics": "Crear Temas", "reply-to-topics": "Responder a Temas", "tag-topics": "Poner Tags (etiquetas) a Temas", - "edit-posts": "Editar entradas", + "edit-posts": "Editar Entradas", "view-edit-history": "Ver Historial de Ediciones", "delete-posts": "Borrar Entradas", - "view_deleted": "View Deleted Posts", + "view_deleted": "Ver Mensajes Eliminados", "upvote-posts": "Votar Positivo en Entradas", "downvote-posts": "Votar Negativo en Entradas", "delete-topics": "Borrar Temas", diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index 71b45325d5..04c7ef39e1 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -6,9 +6,9 @@ "headers.allow-from": "Establecer ALLOW-FROM para poner NodeBB en un iFrame", "headers.powered-by": "Personalizar la cabecera \"powered By\" enviada por NodeBB", "headers.acao": "Access-Control-Allow-Origin", - "headers.acao-regex": "Access-Control-Allow-Origin Regular Expression", + "headers.acao-regex": "Acceso-Controlar-Permitir-Expresión regular de origen", "headers.acao-help": "Para denegar acceso a todos los sitios, dejar vacío", - "headers.acao-regex-help": "Enter regular expressions here to match dynamic origins. To deny access to all sites, leave empty", + "headers.acao-regex-help": "Ingrese expresiones regulares aquí para que coincidan con los orígenes dinámicos. Para denegar el acceso a todos los sitios, déjelo vacío", "headers.acac": "Credenciales-Control-Permitir-Acceso", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", From 0a021d23d450e029508321f0ae18d45a63b73be0 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 16 Jul 2018 17:28:01 -0400 Subject: [PATCH 018/310] theme bumps for #6649 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 5db98b4e62..5e4ef5c755 100644 --- a/install/package.json +++ b/install/package.json @@ -75,9 +75,9 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.5", - "nodebb-theme-persona": "9.0.19", + "nodebb-theme-persona": "9.0.20", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.17", + "nodebb-theme-vanilla": "10.0.18", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From 2c447dbbbd5ee79479e12235cb5b14c2f661073a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jul 2018 21:27:39 +0000 Subject: [PATCH 019/310] Update dependency postcss to v7 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 5e4ef5c755..0cae9ed101 100644 --- a/install/package.json +++ b/install/package.json @@ -82,7 +82,7 @@ "nodemailer": "^4.6.5", "passport": "^0.4.0", "passport-local": "1.0.0", - "postcss": "6.0.22", + "postcss": "7.0.0", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", From 4250808b7632edf5e7f4b26aaec8e8e2430cc30a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 29 Jun 2018 22:32:48 +0000 Subject: [PATCH 020/310] Update dependency coveralls to v3.0.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 0cae9ed101..ad2fe3e930 100644 --- a/install/package.json +++ b/install/package.json @@ -110,7 +110,7 @@ "zxcvbn": "^4.4.2" }, "devDependencies": { - "coveralls": "3.0.1", + "coveralls": "3.0.2", "eslint": "4.19.1", "eslint-config-airbnb-base": "12.1.0", "eslint-plugin-import": "2.12.0", From ae3dcbc5ba52842d09ff90ae47a5fdb24978d038 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jul 2018 21:59:28 +0000 Subject: [PATCH 021/310] Update dependency nodebb-theme-persona to v9.0.21 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ad2fe3e930..dde222b31e 100644 --- a/install/package.json +++ b/install/package.json @@ -75,7 +75,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.5", - "nodebb-theme-persona": "9.0.20", + "nodebb-theme-persona": "9.0.21", "nodebb-theme-slick": "1.2.6", "nodebb-theme-vanilla": "10.0.18", "nodebb-widget-essentials": "4.0.7", From f27d966de8e5e510e76e336880fdaf48306315fd Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Mon, 16 Jul 2018 19:24:24 -0400 Subject: [PATCH 022/310] up vanilla --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index dde222b31e..d40b133b60 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "nodebb-theme-lavender": "5.0.5", "nodebb-theme-persona": "9.0.21", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.18", + "nodebb-theme-vanilla": "10.0.19", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From ce3f0e1b395ce467bfd55caf5b32c8cca9e96595 Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Mon, 16 Jul 2018 21:21:06 -0400 Subject: [PATCH 023/310] up bench --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index d40b133b60..7cc2b8b6d6 100644 --- a/install/package.json +++ b/install/package.json @@ -22,7 +22,7 @@ "async": "2.6.1", "autoprefixer": "^8.5.2", "bcryptjs": "2.4.3", - "benchpressjs": "^1.2.3", + "benchpressjs": "^1.2.4", "body-parser": "^1.18.2", "bootstrap": "^3.3.7", "chart.js": "^2.7.1", From fcb5faa9a9c6ce5bacddc5630ae9dd42225a6761 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 17 Jul 2018 09:29:32 +0000 Subject: [PATCH 024/310] Latest translations and fallbacks --- public/language/pl/admin/general/dashboard.json | 2 +- public/language/pl/admin/general/homepage.json | 2 +- public/language/pl/admin/general/languages.json | 2 +- public/language/pl/admin/manage/admins-mods.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/pl/admin/general/dashboard.json b/public/language/pl/admin/general/dashboard.json index 50e4753d7c..18048c4e82 100644 --- a/public/language/pl/admin/general/dashboard.json +++ b/public/language/pl/admin/general/dashboard.json @@ -21,7 +21,7 @@ "updates": "Aktualizacje", "running-version": "Forum działa dzięki NodeBB v%1", - "keep-updated": "Regularnie aktualizuj NodeBB, by podnosić bezpieczeństwo i wprowadzać poprawki.", + "keep-updated": "Aktualizuj NodeBB regularnie, by zwiększać bezpieczeństwa i wprowadzać poprawki.", "up-to-date": "

NodeBB jest aktualny

", "upgrade-available": "

Została wydana nowa wersja (v%1). Rozważ aktualizację NodeBB.

", "prerelease-upgrade-available": "

To jest nieaktualna przedpremierowa wersja NodeBB. Została wydana nowa wersja (v%1). Rozważ aktualizację NodeBB.

", diff --git a/public/language/pl/admin/general/homepage.json b/public/language/pl/admin/general/homepage.json index 9328e9a37b..05fb9e34d9 100644 --- a/public/language/pl/admin/general/homepage.json +++ b/public/language/pl/admin/general/homepage.json @@ -1,6 +1,6 @@ { "home-page": "Strona główna", - "description": "Wybierz stronę startową dla twojego forum.", + "description": "Wybierz stronę startową dla forum", "home-page-route": "Ścieżka strony głównej", "custom-route": "Niestandardowa Ścieżka", "allow-user-home-pages": "Zezwalaj na strony startowe użytkowników", diff --git a/public/language/pl/admin/general/languages.json b/public/language/pl/admin/general/languages.json index 0fcddf876f..6fa0554e20 100644 --- a/public/language/pl/admin/general/languages.json +++ b/public/language/pl/admin/general/languages.json @@ -1,6 +1,6 @@ { "language-settings": "Ustawienia językowe", - "description": "Domyślny język określa ustawienia języka dla wszystkich użytkowników, którzy odwiedzają forum.
Użytkownicy mogą zmienić domyślny język, w ustawieniach swojego konta.", + "description": "Domyślny język określa ustawienia języka dla wszystkich użytkowników, którzy odwiedzają forum.
Użytkownicy mogą zmienić domyślny język w ustawieniach swojego konta.", "default-language": "Domyślny język", "auto-detect": "Automatycznie wykrywaj język gości" } \ No newline at end of file diff --git a/public/language/pl/admin/manage/admins-mods.json b/public/language/pl/admin/manage/admins-mods.json index 32cbe8fa38..ed6d5082ac 100644 --- a/public/language/pl/admin/manage/admins-mods.json +++ b/public/language/pl/admin/manage/admins-mods.json @@ -2,7 +2,7 @@ "administrators": "Administratorzy", "global-moderators": "Globalni moderatorzy", "no-global-moderators": "Brak globalnych moderatorów", - "moderators-of-category": "%1 moderator(ów)", + "moderators-of-category": "Moderatorzy %1", "no-moderators": "Brak moderatorów", "add-administrator": "Dodaj administratora", "add-global-moderator": "Dodaj globalnego moderatora", From a07b45fd0fe70aea65225b6261a4fbb3de60fbb9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 17 Jul 2018 12:33:24 -0400 Subject: [PATCH 025/310] closes #6642 --- public/src/modules/chat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 558229c4a6..cde54caf05 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -211,7 +211,7 @@ define('chat', [ chatModal.find('.modal-header').on('dblclick', gotoChats); chatModal.find('button[data-action="maximize"]').on('click', gotoChats); chatModal.find('button[data-action="minimize"]').on('click', function () { - var uuid = chatModal.attr('uuid'); + var uuid = chatModal.attr('data-uuid'); module.minimize(uuid); }); From 266eacac7cc7fb3ae5426a75a3f93aa1dec5760d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 17 Jul 2018 12:56:13 -0400 Subject: [PATCH 026/310] closes #6655 --- public/src/modules/chat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index cde54caf05..0e916cc407 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -215,7 +215,7 @@ define('chat', [ module.minimize(uuid); }); - chatModal.on('click', function () { + chatModal.on('click', ':not(.close)', function () { taskbar.updateActive(this.getAttribute('data-uuid')); if (dragged) { From 9d90d19a6f2d11e2e36ce06f9f3a2783f6f75b81 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 17 Jul 2018 06:38:40 +0000 Subject: [PATCH 027/310] Update node:8.11.3 Docker digest to deb628 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 614e778003..3084f1caf4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # The base image is the latest 8.x node (LTS) -FROM node:8.11.3@sha256:38953a117b8f794426429314126af19ff17bbfaa5449c1829b9a8412b8ef4536 +FROM node:8.11.3@sha256:deb6287c3b94e153933ed9422db4524d2ee41be00b32c88a7cd2d91d17bf8a5e RUN mkdir -p /usr/src/app WORKDIR /usr/src/app From b7fc8493b7b10fcc3107e73c33e682af3d1e6cbe Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 17 Jul 2018 13:22:31 -0400 Subject: [PATCH 028/310] closes #6635 --- public/src/modules/helpers.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 2171eedfba..9e0eb2088c 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -185,7 +185,10 @@ } } return states.map(function (priv) { - return ''; + var guestDisabled = ['groups:moderate', 'groups:posts:upvote', 'groups:posts:downvote']; + var disabled = member === 'guests' && guestDisabled.includes(priv.name); + + return ''; }).join(''); } From 4f0a24cfed97e82d4091427aaf614f6fffa69405 Mon Sep 17 00:00:00 2001 From: djls45 Date: Mon, 16 Jul 2018 20:35:36 -0400 Subject: [PATCH 029/310] Preserve case of respondee's slug when responding to their post. --- public/src/client/topic/postTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 8d460d7ae3..1ad284c144 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -338,7 +338,7 @@ define('forum/topic/postTools', [ } if (post.length) { - slug = post.attr('data-userslug'); + slug = utils.slugify(post.attr('data-username'), true); } if (post.length && post.attr('data-uid') !== '0') { slug = '@' + slug; From b24643e0ab8d2b7ea3e0705fa9d5dcb30e884ce3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Jul 2018 23:12:19 +0000 Subject: [PATCH 030/310] Update dependency autoprefixer to v9 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7cc2b8b6d6..7c2cc8c555 100644 --- a/install/package.json +++ b/install/package.json @@ -20,7 +20,7 @@ "ace-builds": "^1.2.9", "archiver": "^2.1.1", "async": "2.6.1", - "autoprefixer": "^8.5.2", + "autoprefixer": "^9.0.0", "bcryptjs": "2.4.3", "benchpressjs": "^1.2.4", "body-parser": "^1.18.2", From e35d4a7d85c125b3078587a1f93de3b845ec3365 Mon Sep 17 00:00:00 2001 From: "Sebastian G. Marinescu" Date: Tue, 17 Jul 2018 15:55:31 -0400 Subject: [PATCH 031/310] closes #6283 --- src/meta/tags.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/meta/tags.js b/src/meta/tags.js index 09019884c3..fe95bab6cf 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -56,7 +56,7 @@ Tags.parse = function (req, data, meta, link, callback) { var defaultLinks = [{ rel: 'icon', type: 'image/x-icon', - href: nconf.get('relative_path') + '/favicon.ico' + (Meta.config['cache-buster'] ? '?' + Meta.config['cache-buster'] : ''), + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/favicon.ico' + (Meta.config['cache-buster'] ? '?' + Meta.config['cache-buster'] : ''), }, { rel: 'manifest', href: nconf.get('relative_path') + '/manifest.json', @@ -75,31 +75,31 @@ Tags.parse = function (req, data, meta, link, callback) { if (Meta.config['brand:touchIcon']) { defaultLinks.push({ rel: 'apple-touch-icon', - href: nconf.get('relative_path') + '/apple-touch-icon', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-orig.png', }, { rel: 'icon', sizes: '36x36', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-36.png', }, { rel: 'icon', sizes: '48x48', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-48.png', }, { rel: 'icon', sizes: '72x72', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-72.png', }, { rel: 'icon', sizes: '96x96', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-96.png', }, { rel: 'icon', sizes: '144x144', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-144.png', }, { rel: 'icon', sizes: '192x192', - href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png', + href: nconf.get('relative_path') + nconf.get('upload_url') + '/system/touchicon-192.png', }); } plugins.fireHook('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }, next); From ec33a12dadce94d23142af6df7e886282105ef94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Jul 2018 21:14:53 -0400 Subject: [PATCH 032/310] closes #6644 --- public/src/client/topic/events.js | 2 ++ public/src/client/topic/postTools.js | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index ac4c41e96b..544d8039a6 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -159,6 +159,8 @@ define('forum/topic/events', [ }); }); } + + postTools.removeMenu(components.get('post', 'pid', data.post.pid)); } function tagsUpdated(tags) { diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 1ad284c144..1608811166 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -66,6 +66,10 @@ define('forum/topic/postTools', [ postEl.find('[component="post/restore"]').toggleClass('hidden', !isDeleted); postEl.find('[component="post/purge"]').toggleClass('hidden', !isDeleted); + PostTools.removeMenu(postEl); + }; + + PostTools.removeMenu = function (postEl) { postEl.find('[component="post/tools"] .dropdown-menu').html(''); }; From de886d94c84f7cd639fb246c5c55e1faa6f0c26c Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Wed, 18 Jul 2018 00:30:35 -0400 Subject: [PATCH 033/310] up benchpress --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7c2cc8c555..65c78aa8ec 100644 --- a/install/package.json +++ b/install/package.json @@ -22,7 +22,7 @@ "async": "2.6.1", "autoprefixer": "^9.0.0", "bcryptjs": "2.4.3", - "benchpressjs": "^1.2.4", + "benchpressjs": "^1.2.5", "body-parser": "^1.18.2", "bootstrap": "^3.3.7", "chart.js": "^2.7.1", From 27b1289b87e73fad981140286e2e0085c41eef41 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 19 Jul 2018 09:29:00 +0000 Subject: [PATCH 034/310] Latest translations and fallbacks --- public/language/pl/admin/general/homepage.json | 2 +- public/language/pl/admin/manage/categories.json | 4 ++-- public/language/pl/admin/manage/ip-blacklist.json | 8 ++++---- public/language/pl/admin/manage/post-queue.json | 4 ++-- public/language/pl/admin/manage/registration.json | 10 +++++----- public/language/pl/admin/manage/tags.json | 6 +++--- public/language/pl/admin/manage/users.json | 6 +++--- public/language/pl/admin/settings/general.json | 2 +- public/language/pl/admin/settings/user.json | 10 +++++----- public/language/pl/email.json | 2 +- public/language/pl/error.json | 2 +- 11 files changed, 28 insertions(+), 28 deletions(-) diff --git a/public/language/pl/admin/general/homepage.json b/public/language/pl/admin/general/homepage.json index 05fb9e34d9..0fc4160302 100644 --- a/public/language/pl/admin/general/homepage.json +++ b/public/language/pl/admin/general/homepage.json @@ -4,5 +4,5 @@ "home-page-route": "Ścieżka strony głównej", "custom-route": "Niestandardowa Ścieżka", "allow-user-home-pages": "Zezwalaj na strony startowe użytkowników", - "home-page-title": "Tytuł strony głównej (domyślnie: \"Strona Główna\")" + "home-page-title": "Tytuł strony głównej (domyślnie: „Strona Główna”)" } \ No newline at end of file diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 5ec5033a29..b1e55e9f7e 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -28,7 +28,7 @@ "select-category": "Wybierz kategorię", "set-parent-category": "Ustaw nadrzędną kategorie", - "privileges.description": "W tej sekcji możesz skonfigurować uprawnienia kontroli dostępu dla tej kategorii. Uprawnienia mogą być przyznawane dla każdego użytkownika lub dla poszczególnych grup. Możesz dodać nowego użytkownika do tej tabeli, wyszukując je w formularzu poniżej.", + "privileges.description": "W tej sekcji możesz skonfigurować uprawnienia dostępu dla tej kategorii. Uprawnienia mogą być przyznawane konkretnym użytkownikom lub poszczególnym grupom. Możesz dodać nowego użytkownika do tej tabeli, wyszukując go w formularzu poniżej.", "privileges.warning": "Uwaga: Uprawnienia zapisują się natychmiastowo. Nie ma potrzeby zapisywania kategorii po zmianie ustawień.", "privileges.section-viewing": "Lista uprawnień", "privileges.section-posting": "Uprawnienia pisania", @@ -41,7 +41,7 @@ "privileges.search-group": "Dodaj grupę", "privileges.copy-to-children": "Skopiuj do podrzędnej", "privileges.copy-from-category": "Skopiuj z kategorii", - "privileges.inherit": "W przypadku, gdy grupie registered-users zostaje nadane specyficzne uprawnienia, wszystkie inne grupy otrzymują to bezwarunkowe uprawnienie, nawet jeśli ów nie zostało zdefiniowane/zaznaczone. Bezwarunkowe uprawnienie jest wyświetlane ponieważ wszyscy użytkownicy są częścią grupy registered-users, więc uprawnienia dla dodatkowych grup nie mogą się wykluczać.", + "privileges.inherit": "Gdy grupie registered-users zostaje nadane określone uprawnienie, to samo bezwarunkowe uprawnienie otrzymują też wszystkie inne grupy, nawet jeśli nie zostały zdefiniowane/zaznaczone. Bezwarunkowe uprawnienie jest wyświetlane, ponieważ wszyscy użytkownicy są częścią grupy registered-users, zatem uprawnienia dla dodatkowych grup nie muszą być przyznawane oddzielnie.", "analytics.back": "Wróć do listy kategorii", "analytics.title": "Analityka dla \"%1\" kategorii", diff --git a/public/language/pl/admin/manage/ip-blacklist.json b/public/language/pl/admin/manage/ip-blacklist.json index 427c9f5a95..6616e9c1af 100644 --- a/public/language/pl/admin/manage/ip-blacklist.json +++ b/public/language/pl/admin/manage/ip-blacklist.json @@ -1,14 +1,14 @@ { - "lead": "Tutaj skonfiguruj swoją czarną listę IP.", - "description": "Czasami ban konta użytkownika nie jest wystarczającym zabezpieczeniem. Wtedy ograniczanie dostępu do forum dla konkretnego adresu IP lub zakresu adresów IP jest najlepszą metodą ochrony forum. W tym przypadku możesz dodać adresy IP lub całe bloki CIDR do czarnej listy i będą one miały zablokowaną możliwość logowania na forum lub rejestracji nowych kont.", + "lead": "Tutaj skonfiguruj czarną listę IP", + "description": "Czasem ban konta użytkownika nie jest wystarczającym zabezpieczeniem. Wówczas najlepszą metodą ochrony forum jest ograniczenie dostępu do forum z konkretnego adresu IP lub zakresu adresów IP. W tym przypadku możesz dodać adresy IP lub całe bloki CIDR do czarnej listy i tym samym uniemożliwić im logowanie się na forum lub zakładanie nowych kont.", "active-rules": "Aktywne reguły", - "validate": "Sprawdzanie czarnej listy", + "validate": "Sprawdź czarną listę", "apply": "Zastosuj czarną listę", "hints": "Podpowiedzi składni", "hint-1": "W każdej linii zdefiniuj pojedynczy adres IP. Możesz dodać bloki IP pod warunkiem, że spełniają one wymagania formatu CIDR (np. 192.168.100.0/22).", "hint-2": "Możesz dodawać komentarze poprzez rozpoczęcie linii symbolem #.", - "validate.x-valid": "%1 z %2 reguła(-u) są poprawne.", + "validate.x-valid": "%1 z %2 reguł jest poprawnych.", "validate.x-invalid": "Następujące %1 reguły są niewłaściwe:", "alerts.applied-success": "Zastosowano czarną listę", diff --git a/public/language/pl/admin/manage/post-queue.json b/public/language/pl/admin/manage/post-queue.json index 815c1645c0..0942d503ee 100644 --- a/public/language/pl/admin/manage/post-queue.json +++ b/public/language/pl/admin/manage/post-queue.json @@ -1,11 +1,11 @@ { "post-queue": "Kolejka postów", - "description": "Brak postów w kolejce.
W celu włączenia tej funkcji, odwiedź Ustawienia → Posty → Ograniczenia pisania i włącz Kolejkę postów . ", + "description": "Brak postów w kolejce.
W celu włączenia tej funkcji, przejdź do Ustawienia → Posty → Ograniczenia pisania i włącz Kolejkę postów. ", "user": "Użytkownik", "category": "Kategoria", "title": "Tytuł", "content": "Zawartość", "posted": "Napisano", "reply-to": "Odpowiedz do \"%1\"", - "content-editable": "Przed wysłaniem możesz kliknąć na danej treści aby edytować." + "content-editable": "Możesz kliknąć na danej treści, by edytować ją przed publikacją." } \ No newline at end of file diff --git a/public/language/pl/admin/manage/registration.json b/public/language/pl/admin/manage/registration.json index 1915b97a44..b2c9e682e8 100644 --- a/public/language/pl/admin/manage/registration.json +++ b/public/language/pl/admin/manage/registration.json @@ -1,9 +1,9 @@ { "queue": "Kolejka", - "description": "Brak użytkowników w kolejce rejestracji.
W celu włączenia tej funkcji, odwiedź Ustawienia → Użytkownik → Rejestracja Użytkownika i ustaw Typ Rejestracji na \"Zatwierdzenie administratora\". ", + "description": "Brak użytkowników w kolejce rejestracji.
W celu włączenia tej funkcji, przejdź do Ustawienia → Użytkownik → Rejestracja użytkownika i jako Typ rejestracji ustaw „Zatwierdzenie przez administratora”. ", "list.name": "Nazwa", - "list.email": "Adres email", + "list.email": "Adres e-mail", "list.ip": "IP", "list.time": "Czas", "list.username-spam": "Częstotliwość: %1 Występowanie: %2 Pewność: %3", @@ -11,10 +11,10 @@ "list.ip-spam": "Częstotliwość: %1 Występowanie: %2", "invitations": "Zaproszenia", - "invitations.description": "Poniżej jest pełna lista wysłanych zaproszeń. Użyj CTRL-f , aby przeszukiwać listę poprzez adres email lub nazwę użytkownika.

Ten użytkownik będzie wyświetlony po prawej od wiadomości do użytkowników, którzy wykorzystali zaproszenia.", + "invitations.description": "Poniżej znajduje się pełna lista wysłanych zaproszeń. Użyj CTRL-f , by przeszukać listę po adresie e-mail lub nazwie użytkownika.

Nazwa użytkownika, który skorzystał z zaproszenia, zostanie wyświetlona po prawej stronie jego adresu e-mail.", "invitations.inviter-username": "Nazwa użytkownika zapraszającego", - "invitations.invitee-email": "Adres email zaproszonego(-ej)", - "invitations.invitee-username": "Nazwa użytkownika zapraszającego (jeśli zarejestrowany)", + "invitations.invitee-email": "Adres e-mail zaproszonego", + "invitations.invitee-username": "Nazwa użytkownika zaproszonego (jeśli zarejestrowany)", "invitations.confirm-delete": "Czy na pewno skasować to zaproszenie?" } \ No newline at end of file diff --git a/public/language/pl/admin/manage/tags.json b/public/language/pl/admin/manage/tags.json index 3c8bea86d4..d2aea91ab6 100644 --- a/public/language/pl/admin/manage/tags.json +++ b/public/language/pl/admin/manage/tags.json @@ -2,14 +2,14 @@ "none": "Twoje forum nie ma jeszcze żadnych tematów z tagami.", "bg-color": "Kolor tła", "text-color": "Kolor tekstu", - "create-modify": "Utwórz oraz modyfikuj tagi", - "description": "Wybierz tagi poprzez klikanie lub przeciąganie, użyj przycisku shift do zaznaczenia wielu.", + "create-modify": "Twórz i modyfikuj tagi", + "description": "Wybieraj tagi poprzez klikanie lub przeciąganie; użyj przycisku shift do zaznaczenia wielu.", "create": "Utwórz tag", "modify": "Modyfikuj tagi", "rename": "Przemianuj tagi", "delete": "Usuń zaznaczone tagi", "search": "Szukanie tagów...", - "settings": "Kliknij tutaj, aby odwiedzić stronę zarządzania tagami.", + "settings": "Kliknij tutaj, aby przejść do strony zarządzania tagami.", "name": "Nazwa taga", "alerts.editing-multiple": "Edycja wielu tagów", diff --git a/public/language/pl/admin/manage/users.json b/public/language/pl/admin/manage/users.json index cdd0a0a588..edcce04442 100644 --- a/public/language/pl/admin/manage/users.json +++ b/public/language/pl/admin/manage/users.json @@ -18,13 +18,13 @@ "new": "Nowy użytkownik", "pills.latest": "Nowi użytkownicy", - "pills.unvalidated": "Niezweryfikowany", + "pills.unvalidated": "Niezweryfikowani", "pills.no-posts": "Brak postów", "pills.top-posters": "Najwięcej postów", "pills.top-rep": "Najwyższa reputacja", - "pills.inactive": "Nieaktywny", + "pills.inactive": "Nieaktywni", "pills.flagged": "Najwięcej flag", - "pills.banned": "Zbanowany", + "pills.banned": "Zbanowani", "pills.search": "Wyszukiwanie użytkowników", "search.uid": "Po ID użytkownika", diff --git a/public/language/pl/admin/settings/general.json b/public/language/pl/admin/settings/general.json index 3f9ee7e1b7..386ce862af 100644 --- a/public/language/pl/admin/settings/general.json +++ b/public/language/pl/admin/settings/general.json @@ -13,7 +13,7 @@ "description.placeholder": "Krótki opis twojej społeczności", "description": "Opis strony", "keywords": "Słowa kluczowe strony", - "keywords-placeholder": "Słowa kluczowe opisujące twoją społeczność, oddzielone przecinkami", + "keywords-placeholder": "Słowa kluczowe opisujące społeczność, oddzielone przecinkami", "logo": "Logo strony", "logo.image": "Obraz", "logo.image-placeholder": "Ścieżka do logo, które ma być wyświetlane w nagłówku forum", diff --git a/public/language/pl/admin/settings/user.json b/public/language/pl/admin/settings/user.json index 7b4b71f139..ea699bbbb4 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -1,7 +1,7 @@ { "authentication": "Uwierzytelnianie", "allow-local-login": "Zezwalaj na lokalne logowanie", - "require-email-confirmation": "Wymagaj potwierdzenia adresu email", + "require-email-confirmation": "Wymagaj potwierdzenia adresu e-mail", "email-confirm-interval": "Użytkownik nie może ponownie wysłać e-maila z potwierdzeniem, dopóki nie minie", "email-confirm-email2": "minut", "allow-login-with": "Zezwalaj na logowanie przy użyciu", @@ -10,12 +10,12 @@ "allow-login-with.email": "Tylko adresu email", "account-settings": "Ustawienia konta", "disable-username-changes": "Wyłącz możliwość zmiany nazwy użytkownika", - "disable-email-changes": "Wyłącz możliwość zmiany adresu email", + "disable-email-changes": "Wyłącz możliwość zmiany adresu e-mail", "disable-password-changes": "Wyłącz możliwość zmiany hasła", "allow-account-deletion": "Zezwalaj na usunięcie konta", "user-info-private": "Ukrywaj listę oraz dane użytkowników przed gośćmi", "hide-fullname": "Ukrywaj pełne imię i nazwisko przed innymi użytkownikami", - "hide-email": "Ukryj adresy email użytkowników", + "hide-email": "Ukryj adresy e-mail użytkowników", "themes": "Motywy", "disable-user-skins": "Nie zezwalaj użytkownikom na wybranie niestandardowej skórki", "account-protection": "Ochrona konta", @@ -29,7 +29,7 @@ "registration": "Rejestracja użytkownika", "registration-type": "Typ rejestracji", "registration-type.normal": "Standardowa", - "registration-type.admin-approval": "Zatwierdzenie administratora", + "registration-type.admin-approval": "Zatwierdzenie przez administratora", "registration-type.admin-approval-ip": "Zatwierdzenie administratora dla IP", "registration-type.invite-only": "Tylko zaproszenia", "registration-type.admin-invite-only": "Tylko zaproszenia administratora", @@ -49,7 +49,7 @@ "user-search": "Wyszukiwanie użytkownków", "user-search-results-per-page": "Liczba wyników do wyświetlenia", "default-user-settings": "Domyślne ustawienia użytkownika", - "show-email": "Pokazuj adres email", + "show-email": "Pokazuj adres e-mail", "show-fullname": "Pokazuj pełną nazwę uzytkownika", "restrict-chat": "Przyjmuj wiadomości na czacie tylko od osób, które obserwuję", "outgoing-new-tab": "Otwieraj odnośniki wychodzące na nowej karcie", diff --git a/public/language/pl/email.json b/public/language/pl/email.json index ed6eb7cb66..b915282560 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -19,7 +19,7 @@ "reset.notify.text2": "Jeśli nie wyraziłeś na to zgody, niezwłocznie poinformuj administratora.", "digest.notifications": "Masz nowe powiadomienia od %1:", "digest.latest_topics": "Ostatnie tematy z %1", - "digest.cta": "Kliknij, by odwiedzić %1", + "digest.cta": "Kliknij tutaj, by przejść do %1", "digest.unsub.info": "To podsumowanie zostało wysłane zgodnie z Twoimi ustawieniami.", "digest.no_topics": "Nie było żadnych aktywnych tematów w ciągu ostatnich %1", "digest.day": "dni", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 2e538c39ec..038c725803 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -27,7 +27,7 @@ "email-not-confirmed-chat": "Nie możesz prowadzić rozmów, dopóki twój email nie zostanie potwierdzony. Kliknij tutaj, aby potwierdzić swój email.", "email-not-confirmed-email-sent": "Twój e-mail jeszcze nie został potwierdzony, proszę sprawdzić swoją skrzynkę odbiorczą.", "no-email-to-confirm": "To forum wymaga weryfikacji przez email. Proszę kliknąć tutaj, aby wprowadzić adres.", - "email-confirm-failed": "Nie byliśmy w stanie potwierdzić twojego email-a. Proszę spróbować później.", + "email-confirm-failed": "Nie byliśmy w stanie potwierdzić Twojego adresu e-mail. Spróbuj później.", "confirm-email-already-sent": "Email potwierdzający został już wysłany, proszę odczekaj jeszcze %1 minut(y), aby wysłać kolejny.", "sendmail-not-found": "Program sendmail nie został znaleziony, proszę upewnij się, że jest zainstalowany i możliwy do uruchomienia przez użytkownika uruchamiającego NodeBB.", "username-too-short": "Nazwa użytkownika za krótka", From 6f73575f25ae541a6a497a4bbb3b9c9dffaa14bf Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 24 Jun 2018 17:11:33 +0000 Subject: [PATCH 035/310] Update dependency eslint-plugin-import to v2.13.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 65c78aa8ec..3f70da7629 100644 --- a/install/package.json +++ b/install/package.json @@ -113,7 +113,7 @@ "coveralls": "3.0.2", "eslint": "4.19.1", "eslint-config-airbnb-base": "12.1.0", - "eslint-plugin-import": "2.12.0", + "eslint-plugin-import": "2.13.0", "grunt": "1.0.3", "grunt-contrib-watch": "1.1.0", "jsdom": "11.11.0", From d473a85ea160154a8e5a48dbdf6ff95c59ae52ed Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 20 Jul 2018 02:58:00 +0000 Subject: [PATCH 036/310] Update dependency postcss to v7.0.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3f70da7629..94ab028d33 100644 --- a/install/package.json +++ b/install/package.json @@ -82,7 +82,7 @@ "nodemailer": "^4.6.5", "passport": "^0.4.0", "passport-local": "1.0.0", - "postcss": "7.0.0", + "postcss": "7.0.1", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", From 11258dac9c312b271051e03f7f6de131bc9eeeac Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 20 Jul 2018 09:28:50 +0000 Subject: [PATCH 037/310] Latest translations and fallbacks --- .../pl/admin/appearance/customise.json | 2 +- public/language/pl/admin/extend/plugins.json | 2 +- public/language/pl/admin/extend/widgets.json | 10 ++-- .../language/pl/admin/manage/privileges.json | 46 +++++++++---------- .../pl/admin/settings/reputation.json | 4 +- public/language/pl/error.json | 2 +- public/language/pl/pages.json | 2 +- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/language/pl/admin/appearance/customise.json b/public/language/pl/admin/appearance/customise.json index 1fc191cc05..6870bb842f 100644 --- a/public/language/pl/admin/appearance/customise.json +++ b/public/language/pl/admin/appearance/customise.json @@ -12,5 +12,5 @@ "custom-header.enable": "Włącz własny nagłówek", "custom-css.livereload": "Włącz dynamiczne przeładowanie", - "custom-css.livereload.description": "Włącz to, aby zmusić wszystkie sesje do odświeżenia na każdym urządzeniu na twoim koncie gdziekolwiek klikniesz zapisz." + "custom-css.livereload.description": "Włącz, jeśli chcesz wymusić odświeżenie wszystkich sesji na każdym urządzeniu na Twoim koncie zawsze, gdy klikniesz „zapisz”." } \ No newline at end of file diff --git a/public/language/pl/admin/extend/plugins.json b/public/language/pl/admin/extend/plugins.json index 912c9619a4..04624b3ad0 100644 --- a/public/language/pl/admin/extend/plugins.json +++ b/public/language/pl/admin/extend/plugins.json @@ -11,7 +11,7 @@ "plugin-search-placeholder": "Szukaj wtyczki...", "reorder-plugins": "Posortuj wtyczki", "order-active": "Posortuj aktywne wtyczki", - "dev-interested": "Zainteresowany pisaniem wtyczek do NodeBB?", + "dev-interested": "Chcesz pisać wtyczki do NodeBB?", "docs-info": "Pełna dokumentacja dotycząca tworzenia wtyczek jest dostępna na NodeBB Docs Portal.", "order.description": "Niektóre wtyczki działają optymalnie wówczas, gdy są inicjalizowane przed innymi/po innych.", diff --git a/public/language/pl/admin/extend/widgets.json b/public/language/pl/admin/extend/widgets.json index 36c2ede57b..1e9e7bb184 100644 --- a/public/language/pl/admin/extend/widgets.json +++ b/public/language/pl/admin/extend/widgets.json @@ -1,8 +1,8 @@ { "available": "Dostępne Widgety", "explanation": "Wybierz widget z menu rozwijalnego i przeciągnij go na wybrane pole z lewej strony.", - "none-installed": "Nie odnaleziono widżetów! Aktywuj wtyczkę \"essential widgets\" w panelu sterowania wtyczek.", - "clone-from": "Sklonuj widżet z", + "none-installed": "Nie odnaleziono widgetów! Aktywuj wtyczkę „essential widgets” w panelu sterowania wtyczek.", + "clone-from": "Sklonuj widget z", "containers.available": "Dostępne kontenery", "containers.explanation": "Przeciągnij i upuść na dowolnym, aktywnym widżecie", "containers.none": "Żadna", @@ -14,9 +14,9 @@ "container.alert": "Alarm", "alert.confirm-delete": "Czy na pewno chcesz usunąć ten widget?", - "alert.updated": "Widżety zaktualizowane", - "alert.update-success": "Widżety zostały pomyślnie zaktualizowane", - "alert.clone-success": "Widżety zostały pomyślnie sklonowane", + "alert.updated": "Widgety zaktualizowane", + "alert.update-success": "Widgety zostały zaktualizowane", + "alert.clone-success": "Widgety zostały sklonowane", "error.select-clone": "Proszę wybrać stronę do sklonowania" } \ No newline at end of file diff --git a/public/language/pl/admin/manage/privileges.json b/public/language/pl/admin/manage/privileges.json index d29d0125f2..bb46669177 100644 --- a/public/language/pl/admin/manage/privileges.json +++ b/public/language/pl/admin/manage/privileges.json @@ -2,28 +2,28 @@ "global": "Globalny", "global.no-users": "Brak globalnych uprawnień zdefiniowanych dla użytkownika", - "chat": "Czat", - "upload-images": "Wgraj zdjęcia", - "upload-files": "Wgraj pliki", - "signature": "Podpis", - "ban": "Ban", - "search-content": "Szukaj Treści", - "search-users": "Szukaj Użytkowników", - "search-tags": "Szukaj Tagów", + "chat": "Dostęp do czatu", + "upload-images": "Przesyłanie zdjęć", + "upload-files": "Przesyłanie plików", + "signature": "Dodanie sygnatury", + "ban": "Banowanie", + "search-content": "Szukanie treści", + "search-users": "Szukanie użytkowników", + "search-tags": "Szukanie tagów", - "find-category": "Znajdź Kategorię", - "access-category": "Dostęp do Kategorii", - "access-topics": "Dostęp do Tematów", - "create-topics": "Twórz Tematy", - "reply-to-topics": "Odpowiadaj na Tematy", - "tag-topics": "Taguj Tematy", - "edit-posts": "Edytuj Posty", - "view-edit-history": "Zobacz Historię Edycji", - "delete-posts": "Usuwaj Posty", - "view_deleted": "Zobacz usunięte posty", - "upvote-posts": "Lajkuj Posty", - "downvote-posts": "Oceń Posty Negatywnie", - "delete-topics": "Usuwaj Tematy", - "purge": "Czyść", - "moderate": "Moderuj" + "find-category": "Szukanie kategorii", + "access-category": "Dostęp do kategorii", + "access-topics": "Dostęp do tematów", + "create-topics": "Tworzenie tematów", + "reply-to-topics": "Odpowiadanie na tematy", + "tag-topics": "Tagowanie tematów", + "edit-posts": "Edycja postów", + "view-edit-history": "Dostęp do historii edycji", + "delete-posts": "Usuwanie postów", + "view_deleted": "Dostęp do usuniętych postów", + "upvote-posts": "Lajkowanie postów", + "downvote-posts": "Głosowanie przeciw postom", + "delete-topics": "Usuwanie tematów", + "purge": "Czyszczenie", + "moderate": "Moderowanie" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/reputation.json b/public/language/pl/admin/settings/reputation.json index 994356d1b2..e4cfde7e5c 100644 --- a/public/language/pl/admin/settings/reputation.json +++ b/public/language/pl/admin/settings/reputation.json @@ -1,10 +1,10 @@ { "reputation": "Ustawienia reputacji", "disable": "Wyłącz system reputacji", - "disable-down-voting": "Wyłącz system „głosów przeciwko”", + "disable-down-voting": "Wyłącz system głosów przeciw", "votes-are-public": "Wszystkie głosy są publiczne", "thresholds": "Progi aktywności", - "min-rep-downvote": "Minimalna reputacja pozwalająca dawać głosy przeciwko", + "min-rep-downvote": "Minimalna reputacja pozwalająca głosować przeciw", "min-rep-flag": "Minimalna reputacja pozwalająca flagować posty", "min-rep-website": "Minimalna reputacja pozwalająca wypełnić sekcję „Strona WWW” w profilu użytkownika", "min-rep-aboutme": "Minimalna reputacja pozwalająca wypełnić sekcję „O mnie” w profilu użytkownika", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 038c725803..88d6d9fc93 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -122,7 +122,7 @@ "already-voting-for-this-post": "Już zagłosowałeś na ten post", "reputation-system-disabled": "System reputacji jest wyłączony.", "downvoting-disabled": "Negatywna ocena postów jest wyłączona", - "not-enough-reputation-to-downvote": "Masz zbyt niską reputację, aby negatywnie ocenić ten post", + "not-enough-reputation-to-downvote": "Masz zbyt niską reputację, by głosować przeciw postom", "not-enough-reputation-to-flag": "Masz zbyt niską reputację, aby oflagować ten post", "not-enough-reputation-min-rep-website": "Masz zbyt niską reputację, aby dodać stronę", "not-enough-reputation-min-rep-aboutme": "Masz zbyt niską reputację, aby dodać tekst „O mnie”", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 492771821e..66b9dae637 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -47,7 +47,7 @@ "account/watched": "Tematy obserwowane przez %1", "account/ignored": "Tematy zignorowane przez %1", "account/upvoted": "Posty, na które zagłosował %1", - "account/downvoted": "Posty, przeciwko którym zagłosował %1", + "account/downvoted": "Posty, przeciw którym zagłosował %1", "account/best": "Najlepsze posty napisane przez %1", "account/blocks": "Użytkownicy zablokowani przez %1", "account/uploads": "Pliki przesłane przez %1", From f1a6537fc2dada85b539f00dd17545828f93fb49 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 20 Jul 2018 09:29:51 -0500 Subject: [PATCH 038/310] Add notification frequencies from nodebb-plugin-upvote-notifications. (#6640) * Add notification frequencies from nodebb-plugin-upvote-notifications. https://github.com/boomzillawtf/nodebb-plugin-upvote-notifications * Fix editing settings clearing upvote notification preferences. --- public/language/en-GB/user.json | 2 ++ src/controllers/accounts/settings.js | 4 +++- src/socket.io/helpers.js | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index d69941be5d..b971fc682c 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -117,7 +117,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 5f5bb57aa7..0beab3f77a 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -148,7 +148,9 @@ settingsController.get = function (req, res, callback) { var notifFreqOptions = [ 'all', + 'first', 'everyTen', + 'threshold', 'logarithmic', 'disabled', ]; @@ -156,7 +158,7 @@ settingsController.get = function (req, res, callback) { userData.upvoteNotifFreq = notifFreqOptions.map(function (name) { return { name: name, - selected: name === userData.notifFreqOptions, + selected: name === userData.settings.upvoteNotifFreq, }; }); diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 4679b73598..163e7d54d3 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -186,9 +186,15 @@ SocketHelpers.upvote = function (data, notification) { all: function () { return votes > 0; }, + first: function () { + return votes === 1; + }, everyTen: function () { return votes > 0 && votes % 10 === 0; }, + threshold: function () { + return [1, 5, 10, 25].indexOf(votes) !== -1 || (votes >= 50 && votes % 50 === 0); + }, logarithmic: function () { return votes > 1 && Math.log10(votes) % 1 === 0; }, From 87b6808c4e02956a7203a95d69a8145e8231d426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 20 Jul 2018 14:34:42 -0400 Subject: [PATCH 039/310] refactor to use getCidsByPrivilege switch to .includes --- src/categories.js | 10 +++++++++- src/search.js | 16 ++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/categories.js b/src/categories.js index 1270924f0e..1bbc80e599 100644 --- a/src/categories.js +++ b/src/categories.js @@ -95,7 +95,7 @@ Categories.getAllCategories = function (uid, callback) { ], callback); }; -Categories.getCategoriesByPrivilege = function (set, uid, privilege, callback) { +Categories.getCidsByPrivilege = function (set, uid, privilege, callback) { async.waterfall([ function (next) { db.getSortedSetRange(set, 0, -1, next); @@ -103,6 +103,14 @@ Categories.getCategoriesByPrivilege = function (set, uid, privilege, callback) { function (cids, next) { privileges.categories.filterCids(privilege, cids, uid, next); }, + ], callback); +}; + +Categories.getCategoriesByPrivilege = function (set, uid, privilege, callback) { + async.waterfall([ + function (next) { + Categories.getCidsByPrivilege(set, uid, privilege, next); + }, function (cids, next) { Categories.getCategories(cids, uid, next); }, diff --git a/src/search.js b/src/search.js index 89f8cb66ab..5cb8263bc1 100644 --- a/src/search.js +++ b/src/search.js @@ -315,7 +315,7 @@ function filterByTags(posts, hasTags) { var hasAllTags = false; if (post && post.topic && Array.isArray(post.topic.tags) && post.topic.tags.length) { hasAllTags = hasTags.every(function (tag) { - return post.topic.tags.indexOf(tag) !== -1; + return post.topic.tags.includes(tag); }); } return hasAllTags; @@ -370,23 +370,15 @@ function getSearchCids(data, callback) { return callback(null, []); } - if (data.categories.indexOf('all') !== -1) { - async.waterfall([ - function (next) { - db.getSortedSetRange('categories:cid', 0, -1, next); - }, - function (cids, next) { - privileges.categories.filterCids('read', cids, data.uid, next); - }, - ], callback); - return; + if (data.categories.includes('all')) { + return categories.getCidsByPrivilege('categories:cid', data.uid, 'read', callback); } async.waterfall([ function (next) { async.parallel({ watchedCids: function (next) { - if (data.categories.indexOf('watched') !== -1) { + if (data.categories.includes('watched')) { user.getWatchedCategories(data.uid, next); } else { next(null, []); From 7f52e3a8f9a1d5094495fd57e159aa7cfce1562c Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 21 Jul 2018 09:29:29 +0000 Subject: [PATCH 040/310] Latest translations and fallbacks --- public/language/ru/success.json | 2 +- public/language/ru/user.json | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/language/ru/success.json b/public/language/ru/success.json index c19af26e8a..cda8e662fd 100644 --- a/public/language/ru/success.json +++ b/public/language/ru/success.json @@ -1,5 +1,5 @@ { - "success": "Успешно", + "success": "Успешно выполнено", "topic-post": "Запись была успешно создана", "post-queued": "Ваше сообщение помещено в очередь для одобрения.", "authentication-successful": "Авторизация выполнена успешно", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index b0c02e52d2..8c89033988 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -12,7 +12,7 @@ "ban_account_confirm": "Вы действительно хотите заблокировать этого участника?", "unban_account": "Разблокировать учётную запись", "delete_account": "Удалить учётную запись", - "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your password to confirm that you wish to destroy this account.", + "delete_account_confirm": "Вы уверены, что хотите удалить свою учётную запись?
Это действие необратимо, вы не сможете восстановить свои данные

Введите свой пароль для подтверждения уничтожения учётной записи.", "delete_this_account_confirm": "Вы уверены, что хотите удалить этот аккаунт?
Это действие является необратимым, вы не сможете восстановить любые данные

", "account-deleted": "Учётная запись удалена", "fullname": "Полное имя", @@ -91,14 +91,14 @@ "has_no_upvoted_posts": "Участник пока не голосовал положительно ни за одну запись", "has_no_downvoted_posts": "Участник пока не голосовал против ни одной записи", "has_no_voted_posts": "Участник пока не голосовал ни за одну запись", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "Вы никого не блокировали", "email_hidden": "Электронная почта скрыта", "hidden": "скрыто", "paginate_description": "Разбить на страницы, а не выводить бесконечным списком", "topics_per_page": "Тем на странице", "posts_per_page": "Записей на странице", "max_items_per_page": "Максимум %1", - "acp_language": "Язык Административной Страницы", + "acp_language": "Язык админ. панели", "notification_sounds": "Воспроизводить звук во время получения уведомления", "notifications_and_sounds": "Уведомления и звуки", "incoming-message-sound": "Звук входящего сообщения", @@ -146,12 +146,12 @@ "info.moderation-note": "Примечание модератора", "info.moderation-note.success": "Примечание модератора сохранено", "info.moderation-note.add": "Добавить примечание", - "consent.title": "Your Rights & Consent", - "consent.lead": "This community forum collects and processes your personal information.", - "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", - "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", - "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", - "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", + "consent.title": "Ваши права и согласие", + "consent.lead": "Этот форум собирает и обрабатывает вашу личную информацию.", + "consent.intro": "Мы используем эту информацию исключительно для персонализации вашего опыта в этом сообществе, а также для связывания сообщений, которые вы вносите в свою учетную запись пользователя. Во время этапа регистрации вас попросили указать имя пользователя и адрес электронной почты, вы также можете предоставить дополнительную информацию, чтобы заполнить свой профиль пользователя на этом веб-сайте.

Мы сохраняем эту информацию на все время существования учетной записи пользователя, и вы можете отозвать согласие в любое время, удалив свою учетную запись. В любое время вы можете запросить копию своего вклада на этот веб-сайт, используя раздел \"ваши права и согласие\"

Если у вас есть какие-либо вопросы или опасения, мы рекомендуем вам обратиться к администрации этого форума.", + "consent.email_intro": "Иногда мы можем отправлять электронные письма на ваш зарегистрированный адрес электронной почты, чтобы предоставлять обновления и / или уведомлять вас о новой деятельности, которая вам подходит. Вы можете настроить частоту дайджестов сообщества (в том числе отключить его напрямую), а также выбрать, какие типы уведомлений получать по электронной почте, на странице настроек пользователя.", + "consent.digest_frequency": "Если в пользовательских настройках ничего не изменено, это сообщество отправляет электронные дайджесты каждые %1.", + "consent.digest_off": "Если в пользовательских настройках ничего не изменено, это сообщество не отправляет электронные дайджесты", "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", "consent.give": "Give consent", From 448542d4efe047ad65824ffa587a47e13cb95d99 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 22 Jul 2018 09:28:47 +0000 Subject: [PATCH 041/310] Latest translations and fallbacks --- .../language/ar/admin/settings/advanced.json | 4 ++ .../language/ar/admin/settings/uploads.json | 2 + public/language/ar/email.json | 2 + public/language/ar/groups.json | 1 + public/language/ar/pages.json | 5 +- public/language/ar/user.json | 4 ++ .../language/bg/admin/settings/advanced.json | 4 ++ .../language/bg/admin/settings/uploads.json | 2 + public/language/bg/email.json | 2 + public/language/bg/groups.json | 1 + public/language/bg/pages.json | 5 +- public/language/bg/user.json | 4 ++ .../language/bn/admin/settings/advanced.json | 4 ++ .../language/bn/admin/settings/uploads.json | 2 + public/language/bn/email.json | 2 + public/language/bn/groups.json | 1 + public/language/bn/pages.json | 5 +- public/language/bn/user.json | 4 ++ .../language/cs/admin/settings/advanced.json | 4 ++ .../language/cs/admin/settings/uploads.json | 2 + public/language/cs/email.json | 2 + public/language/cs/groups.json | 1 + public/language/cs/pages.json | 5 +- public/language/cs/user.json | 4 ++ .../language/da/admin/settings/advanced.json | 4 ++ .../language/da/admin/settings/uploads.json | 2 + public/language/da/email.json | 2 + public/language/da/groups.json | 1 + public/language/da/pages.json | 5 +- public/language/da/user.json | 4 ++ .../language/de/admin/settings/advanced.json | 4 ++ .../language/de/admin/settings/uploads.json | 2 + public/language/de/email.json | 2 + public/language/de/groups.json | 1 + public/language/de/pages.json | 5 +- public/language/de/user.json | 4 ++ .../language/el/admin/settings/advanced.json | 4 ++ .../language/el/admin/settings/uploads.json | 2 + public/language/el/email.json | 2 + public/language/el/groups.json | 1 + public/language/el/pages.json | 5 +- public/language/el/user.json | 4 ++ .../en-US/admin/settings/advanced.json | 4 ++ .../en-US/admin/settings/uploads.json | 2 + public/language/en-US/email.json | 2 + public/language/en-US/groups.json | 1 + public/language/en-US/pages.json | 5 +- public/language/en-US/user.json | 4 ++ .../en-x-pirate/admin/settings/advanced.json | 4 ++ .../en-x-pirate/admin/settings/uploads.json | 2 + public/language/en-x-pirate/email.json | 2 + public/language/en-x-pirate/groups.json | 1 + public/language/en-x-pirate/pages.json | 5 +- public/language/en-x-pirate/user.json | 4 ++ .../language/es/admin/settings/advanced.json | 4 ++ .../language/es/admin/settings/uploads.json | 2 + public/language/es/email.json | 2 + public/language/es/groups.json | 1 + public/language/es/pages.json | 5 +- public/language/es/user.json | 4 ++ .../language/et/admin/settings/advanced.json | 4 ++ .../language/et/admin/settings/uploads.json | 2 + public/language/et/email.json | 2 + public/language/et/groups.json | 1 + public/language/et/pages.json | 5 +- public/language/et/user.json | 4 ++ .../fa-IR/admin/settings/advanced.json | 4 ++ .../fa-IR/admin/settings/uploads.json | 2 + public/language/fa-IR/email.json | 2 + public/language/fa-IR/groups.json | 1 + public/language/fa-IR/pages.json | 5 +- public/language/fa-IR/user.json | 4 ++ .../language/fi/admin/settings/advanced.json | 4 ++ .../language/fi/admin/settings/uploads.json | 2 + public/language/fi/email.json | 2 + public/language/fi/groups.json | 1 + public/language/fi/pages.json | 5 +- public/language/fi/user.json | 4 ++ .../language/fr/admin/settings/advanced.json | 4 ++ .../language/fr/admin/settings/uploads.json | 2 + public/language/fr/email.json | 2 + public/language/fr/groups.json | 1 + public/language/fr/pages.json | 5 +- public/language/fr/user.json | 4 ++ .../language/gl/admin/settings/advanced.json | 4 ++ .../language/gl/admin/settings/uploads.json | 2 + public/language/gl/email.json | 2 + public/language/gl/groups.json | 1 + public/language/gl/pages.json | 5 +- public/language/gl/user.json | 4 ++ .../language/he/admin/settings/advanced.json | 4 ++ .../language/he/admin/settings/uploads.json | 2 + public/language/he/email.json | 2 + public/language/he/groups.json | 1 + public/language/he/pages.json | 5 +- public/language/he/user.json | 4 ++ .../language/hr/admin/settings/advanced.json | 4 ++ .../language/hr/admin/settings/uploads.json | 2 + public/language/hr/email.json | 2 + public/language/hr/groups.json | 1 + public/language/hr/pages.json | 5 +- public/language/hr/user.json | 4 ++ .../language/hu/admin/settings/advanced.json | 4 ++ .../language/hu/admin/settings/uploads.json | 2 + public/language/hu/email.json | 2 + public/language/hu/groups.json | 1 + public/language/hu/pages.json | 5 +- public/language/hu/user.json | 4 ++ .../language/id/admin/settings/advanced.json | 4 ++ .../language/id/admin/settings/uploads.json | 2 + public/language/id/email.json | 2 + public/language/id/groups.json | 1 + public/language/id/pages.json | 5 +- public/language/id/user.json | 4 ++ .../language/it/admin/settings/advanced.json | 4 ++ .../language/it/admin/settings/uploads.json | 2 + public/language/it/email.json | 2 + public/language/it/groups.json | 1 + public/language/it/pages.json | 5 +- public/language/it/user.json | 4 ++ .../language/ja/admin/settings/advanced.json | 4 ++ .../language/ja/admin/settings/uploads.json | 2 + public/language/ja/email.json | 2 + public/language/ja/groups.json | 1 + public/language/ja/pages.json | 5 +- public/language/ja/user.json | 4 ++ .../language/ko/admin/settings/advanced.json | 4 ++ .../language/ko/admin/settings/uploads.json | 2 + public/language/ko/email.json | 2 + public/language/ko/groups.json | 1 + public/language/ko/pages.json | 5 +- public/language/ko/user.json | 4 ++ .../language/lt/admin/settings/advanced.json | 4 ++ .../language/lt/admin/settings/uploads.json | 2 + public/language/lt/email.json | 2 + public/language/lt/groups.json | 1 + public/language/lt/pages.json | 5 +- public/language/lt/user.json | 4 ++ .../language/ms/admin/settings/advanced.json | 4 ++ .../language/ms/admin/settings/uploads.json | 2 + public/language/ms/email.json | 2 + public/language/ms/groups.json | 1 + public/language/ms/pages.json | 5 +- public/language/ms/user.json | 4 ++ .../language/nb/admin/settings/advanced.json | 4 ++ .../language/nb/admin/settings/uploads.json | 2 + public/language/nb/email.json | 2 + public/language/nb/groups.json | 1 + public/language/nb/pages.json | 5 +- public/language/nb/user.json | 4 ++ .../language/nl/admin/settings/advanced.json | 4 ++ .../language/nl/admin/settings/uploads.json | 2 + public/language/nl/email.json | 2 + public/language/nl/groups.json | 1 + public/language/nl/pages.json | 5 +- public/language/nl/user.json | 4 ++ .../language/pl/admin/settings/advanced.json | 4 ++ .../language/pl/admin/settings/uploads.json | 2 + public/language/pl/email.json | 2 + public/language/pl/groups.json | 1 + public/language/pl/pages.json | 5 +- public/language/pl/user.json | 4 ++ .../pt-BR/admin/settings/advanced.json | 4 ++ .../pt-BR/admin/settings/uploads.json | 2 + public/language/pt-BR/email.json | 2 + public/language/pt-BR/groups.json | 1 + public/language/pt-BR/pages.json | 5 +- public/language/pt-BR/user.json | 4 ++ .../pt-PT/admin/settings/advanced.json | 4 ++ .../pt-PT/admin/settings/uploads.json | 2 + public/language/pt-PT/email.json | 2 + public/language/pt-PT/groups.json | 1 + public/language/pt-PT/pages.json | 5 +- public/language/pt-PT/user.json | 4 ++ .../language/ro/admin/settings/advanced.json | 4 ++ .../language/ro/admin/settings/uploads.json | 2 + public/language/ro/email.json | 2 + public/language/ro/groups.json | 1 + public/language/ro/pages.json | 5 +- public/language/ro/user.json | 4 ++ .../language/ru/admin/settings/advanced.json | 4 ++ .../language/ru/admin/settings/uploads.json | 2 + public/language/ru/email.json | 4 +- public/language/ru/error.json | 52 ++++++++--------- public/language/ru/flags.json | 56 +++++++++---------- public/language/ru/global.json | 4 +- public/language/ru/groups.json | 1 + public/language/ru/modules.json | 24 ++++---- public/language/ru/notifications.json | 12 ++-- public/language/ru/pages.json | 9 ++- public/language/ru/register.json | 6 +- public/language/ru/reset_password.json | 2 +- public/language/ru/search.json | 2 +- public/language/ru/topic.json | 20 +++---- public/language/ru/uploads.json | 6 +- public/language/ru/user.json | 34 ++++++----- .../language/rw/admin/settings/advanced.json | 4 ++ .../language/rw/admin/settings/uploads.json | 2 + public/language/rw/email.json | 2 + public/language/rw/groups.json | 1 + public/language/rw/pages.json | 5 +- public/language/rw/user.json | 4 ++ .../language/sc/admin/settings/advanced.json | 4 ++ .../language/sc/admin/settings/uploads.json | 2 + public/language/sc/email.json | 2 + public/language/sc/groups.json | 1 + public/language/sc/pages.json | 5 +- public/language/sc/user.json | 4 ++ .../language/sk/admin/settings/advanced.json | 4 ++ .../language/sk/admin/settings/uploads.json | 2 + public/language/sk/email.json | 2 + public/language/sk/groups.json | 1 + public/language/sk/pages.json | 5 +- public/language/sk/user.json | 4 ++ .../language/sl/admin/settings/advanced.json | 4 ++ .../language/sl/admin/settings/uploads.json | 2 + public/language/sl/email.json | 2 + public/language/sl/groups.json | 1 + public/language/sl/pages.json | 5 +- public/language/sl/user.json | 4 ++ .../language/sr/admin/settings/advanced.json | 4 ++ .../language/sr/admin/settings/uploads.json | 2 + public/language/sr/email.json | 2 + public/language/sr/groups.json | 1 + public/language/sr/pages.json | 5 +- public/language/sr/user.json | 4 ++ .../language/sv/admin/settings/advanced.json | 4 ++ .../language/sv/admin/settings/uploads.json | 2 + public/language/sv/email.json | 2 + public/language/sv/groups.json | 1 + public/language/sv/pages.json | 5 +- public/language/sv/user.json | 4 ++ .../language/th/admin/settings/advanced.json | 4 ++ .../language/th/admin/settings/uploads.json | 2 + public/language/th/email.json | 2 + public/language/th/groups.json | 1 + public/language/th/pages.json | 5 +- public/language/th/user.json | 4 ++ .../language/tr/admin/settings/advanced.json | 4 ++ .../language/tr/admin/settings/uploads.json | 2 + public/language/tr/email.json | 2 + public/language/tr/groups.json | 1 + public/language/tr/pages.json | 5 +- public/language/tr/user.json | 4 ++ .../language/uk/admin/settings/advanced.json | 4 ++ .../language/uk/admin/settings/uploads.json | 2 + public/language/uk/email.json | 2 + public/language/uk/groups.json | 1 + public/language/uk/pages.json | 5 +- public/language/uk/user.json | 4 ++ .../language/vi/admin/settings/advanced.json | 4 ++ .../language/vi/admin/settings/uploads.json | 2 + public/language/vi/email.json | 2 + public/language/vi/groups.json | 1 + public/language/vi/pages.json | 5 +- public/language/vi/user.json | 4 ++ .../zh-CN/admin/settings/advanced.json | 4 ++ .../zh-CN/admin/settings/uploads.json | 2 + public/language/zh-CN/email.json | 2 + public/language/zh-CN/groups.json | 1 + public/language/zh-CN/pages.json | 5 +- public/language/zh-CN/user.json | 4 ++ .../zh-TW/admin/settings/advanced.json | 4 ++ .../zh-TW/admin/settings/uploads.json | 2 + public/language/zh-TW/email.json | 2 + public/language/zh-TW/groups.json | 1 + public/language/zh-TW/pages.json | 5 +- public/language/zh-TW/user.json | 4 ++ 268 files changed, 841 insertions(+), 153 deletions(-) diff --git a/public/language/ar/admin/settings/advanced.json b/public/language/ar/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/ar/admin/settings/advanced.json +++ b/public/language/ar/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ar/admin/settings/uploads.json b/public/language/ar/admin/settings/uploads.json index d3a05ab6e4..c5e46776d1 100644 --- a/public/language/ar/admin/settings/uploads.json +++ b/public/language/ar/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "المشاركات", "allow-files": "السماح للأعضاء بتحميل الملفات الإعتيادية", "private": "جعل الملفات التي تم رفعها خاصة", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "تغيير حجم الصور إلى عرض محدد (بالبكسل)", "max-image-width-help": "(بالبكسل، الافتراضي: 760 بكسل، ضع إلى 0 لتعطيل الخاصية)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ar/email.json b/public/language/ar/email.json index 5a9df3e975..855cdc2681 100644 --- a/public/language/ar/email.json +++ b/public/language/ar/email.json @@ -4,6 +4,8 @@ "invite": "دعوة من %1", "greeting_no_name": "مرحبًا", "greeting_with_name": "مرحبًا بك يا %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "شكرًا على تسجيلك في %1!", "welcome.text2": "لتفعيل حسابك، نحتاج إلى التأكد من صحة عنوان البريد الإلكتروني الذي سجلت به.", "welcome.text3": "تم قبول نتسجيلك ، يمكنك الدخول باتسخدام اسم المستخدم و كلمة المرور.", diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index f8bee2a62c..d31ac8a0da 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -28,6 +28,7 @@ "details.grant": "منح/سحب المِلكية", "details.kick": "طرد", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "إدارة المجموعة", "details.group_name": "اسم المجموعة", "details.member_count": "عدد اﻷعضاء", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index 79e5323f01..e858f73058 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -6,7 +6,10 @@ "popular-month": "المواضيع الشائعة هذا الشهر", "popular-alltime": "المواضيع الشائعة منذ القدم", "recent": "المواضيع الحديثة", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 9448b2b8ee..ae820862f3 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -31,6 +31,8 @@ "following": "يتابع", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "معلومة عنك او السيرة الذاتية", "signature": "توقيع", "birthday": "عيد ميلاد", @@ -107,7 +109,9 @@ "no-sound": "بدون صوت", "upvote-notif-freq": "معدل تكرار تنبيهات التصويت للأعلى", "upvote-notif-freq.all": "كل التصويتات للأعلى", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "كل عشر تصويتات للأعلى", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "معطل", "browsing": "خيارات التصفح", diff --git a/public/language/bg/admin/settings/advanced.json b/public/language/bg/admin/settings/advanced.json index 8e92299247..b83d5c3d08 100644 --- a/public/language/bg/admin/settings/advanced.json +++ b/public/language/bg/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Удостоверителни данни за разрешаване на управлението на достъпа", "headers.acam": "Методи за разрешаване на управлението на достъпа", "headers.acah": "Заглавки за разрешаване на управлението на достъпа", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Управление на трафика", "traffic.help": "NodeBB има вграден модул, който автоматично отказва заявките в натоварените моменти. Можете да настроите поведението тук, въпреки че стойностите по подразбиране са добра отправна точка.", "traffic.enable": "Включване на управлението на трафика", diff --git a/public/language/bg/admin/settings/uploads.json b/public/language/bg/admin/settings/uploads.json index ab65f620ff..095ca88306 100644 --- a/public/language/bg/admin/settings/uploads.json +++ b/public/language/bg/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Публикации", "allow-files": "Позволяване на потребителите да качват обикновени файлове", "private": "Качените файлове да бъдат частни", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Намаляване на размера на изображенията до определена ширина (в пиксели)", "max-image-width-help": "(в пиксели; по подразбиране: 760 пиксела. 0 = изключено)", "resize-image-quality": "Качество при преоразмеряване на изображенията", diff --git a/public/language/bg/email.json b/public/language/bg/email.json index fb581212a6..c4592fcaef 100644 --- a/public/language/bg/email.json +++ b/public/language/bg/email.json @@ -4,6 +4,8 @@ "invite": "Покана от %1", "greeting_no_name": "Здравейте", "greeting_with_name": "Здравейте, %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Благодарим Ви, че се регистрирахте в %1", "welcome.text2": "За да активирате напълно акаунта си, трябва да потвърдите е-пощата, с която сте се регистрирали.", "welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете със своето потребителско име и парола.", diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 910b77c9cc..fb9cdcb115 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -28,6 +28,7 @@ "details.grant": "Даване/отнемане на собственост", "details.kick": "Изгонване", "details.kick_confirm": "Наистина ли искате да премахнете този член на групата?", + "details.add-member": "Add Member", "details.owner_options": "Администрация на групата", "details.group_name": "Име на групата", "details.member_count": "Брой на членовете", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index 059ae11e52..bcf8887491 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -6,7 +6,10 @@ "popular-month": "Популярните теми този месец", "popular-alltime": "Популярните теми за всички времена", "recent": "Скорошни теми", - "top": "Теми с най-много гласове", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Модераторски инструменти", "flagged-content": "Докладвано съдържание", "ip-blacklist": "Черен списък за IP адреси", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 6fd31f1091..d7d821cb7b 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -31,6 +31,8 @@ "following": "Следва", "blocks": "Блокира", "block_toggle": "Превключване на блокирането", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "За мен", "signature": "Подпис", "birthday": "Рождена дата", @@ -107,7 +109,9 @@ "no-sound": "Без звук", "upvote-notif-freq": "Честота на известията за положителни гласове", "upvote-notif-freq.all": "Всички положителни гласове", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "На всеки десет положителни гласа", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000…", "upvote-notif-freq.disabled": "Изключено", "browsing": "Настройки за страниците", diff --git a/public/language/bn/admin/settings/advanced.json b/public/language/bn/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/bn/admin/settings/advanced.json +++ b/public/language/bn/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/bn/admin/settings/uploads.json b/public/language/bn/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/bn/admin/settings/uploads.json +++ b/public/language/bn/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/bn/email.json b/public/language/bn/email.json index 102f2be541..aefda25871 100644 --- a/public/language/bn/email.json +++ b/public/language/bn/email.json @@ -4,6 +4,8 @@ "invite": "%1 থেকে আমন্ত্রণ", "greeting_no_name": "স্বাগতম", "greeting_with_name": "স্বাগতম %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "%1 এ নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!", "welcome.text2": "আপনার একাউন্ট এ্যাক্টিভেট করার জন্য, আপনি যে ইমেইল এড্রেস ব্যাবহার করে নিবন্ধন করেছেন তা যাচাই করতে হবে", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index 0527c243a8..8da3ec22c7 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index f09d1f1774..4b008a5d9d 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "সাম্প্রতিক টপিক", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/bn/user.json b/public/language/bn/user.json index 06528dc302..1590ab6038 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -31,6 +31,8 @@ "following": "যারা আপনাকে অনুসরণ করছে", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "আমার সম্পর্কে: ", "signature": "স্বাক্ষর", "birthday": "জন্মদিন", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing সেটিংস", diff --git a/public/language/cs/admin/settings/advanced.json b/public/language/cs/admin/settings/advanced.json index 5cf39f453d..3966d94385 100644 --- a/public/language/cs/admin/settings/advanced.json +++ b/public/language/cs/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Správa provozu", "traffic.help": "NodeBB obsahuje modul, který automaticky zamítá požadavky při vysokém vytížení. Toto nastavení můžete zde upravit, ačkoliv výchozí hodnoty jsou zaručením úspěchu.", "traffic.enable": "Povolit správu provozu", diff --git a/public/language/cs/admin/settings/uploads.json b/public/language/cs/admin/settings/uploads.json index a5f5cacc57..d4241414a9 100644 --- a/public/language/cs/admin/settings/uploads.json +++ b/public/language/cs/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Příspěvky", "allow-files": "Povolit uživatelům nahrávat normální soubory", "private": "Nahrané soubory jsou sokromé", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Zmenšit velikost obrázků na potřebné rozlišení (v pixelech)", "max-image-width-help": "(v pixelech, výchozí: 760 pixelů, pro zákaz nastavte 0)", "resize-image-quality": "Kvalita při změně velikosti obrázků", diff --git a/public/language/cs/email.json b/public/language/cs/email.json index 3ef16c56dc..58ef19575e 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -4,6 +4,8 @@ "invite": "Pozvánka od %1", "greeting_no_name": "Dobrý den", "greeting_with_name": "Dobrý den %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Děkujeme vám za registraci na %1!", "welcome.text2": "Pro úplnou aktivaci vašeho účtu potřebujeme ověřit vaši e-mailovou adresu.", "welcome.text3": "Administrátor právě potvrdil vaší registraci. Nyní se můžete přihlásit jménem a heslem.", diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 55d8a80948..24c2aec730 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -28,6 +28,7 @@ "details.grant": "Přidat/Zrušit vlastnictví", "details.kick": "Vyhodit", "details.kick_confirm": "Jste si jist/a, že chcete vyjmout tohoto uživatele ze skupiny?", + "details.add-member": "Add Member", "details.owner_options": "Správa skupiny", "details.group_name": "Název skupiny", "details.member_count": "Počet členů", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index 036087ba7a..708c15ab85 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -6,7 +6,10 @@ "popular-month": "Oblíbená témata pro tento měsíc", "popular-alltime": "Oblíbená témata za celou dobu", "recent": "Aktuální témata", - "top": "Témata s nejvíce hlasy", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Nástroje moderátora", "flagged-content": "Nahlášený obsah", "ip-blacklist": "Černá listina IP adres", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 55230bad6d..9c884e1c05 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -31,6 +31,8 @@ "following": "Sleduje", "blocks": "Zablokováni", "block_toggle": "Přepnout zablokování", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "O mně", "signature": "Podpis", "birthday": "Datum narození", @@ -107,7 +109,9 @@ "no-sound": "Bez zvuku", "upvote-notif-freq": "Frekvence upozornění na souhlasy", "upvote-notif-freq.all": "Všechny souhlasy", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Každý desátý souhlas", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Dle 10, 100, 1000...", "upvote-notif-freq.disabled": "Zakázáno", "browsing": "Nastavení prohlížení", diff --git a/public/language/da/admin/settings/advanced.json b/public/language/da/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/da/admin/settings/advanced.json +++ b/public/language/da/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/da/admin/settings/uploads.json b/public/language/da/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/da/admin/settings/uploads.json +++ b/public/language/da/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/da/email.json b/public/language/da/email.json index 09171c28f3..c7658d01c2 100644 --- a/public/language/da/email.json +++ b/public/language/da/email.json @@ -4,6 +4,8 @@ "invite": "Invitation fra %1", "greeting_no_name": "Hej", "greeting_with_name": "Hej %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Tak for at du registrerede dig hos %1!", "welcome.text2": "For at færdiggøre din konto, har vi brug for at verificere at du ejer den email adresse du registerede med.", "welcome.text3": "En administrator har accepteret din registreringsansøgning. Du kan logge ind med dit brugernavn og adgangskode nu.", diff --git a/public/language/da/groups.json b/public/language/da/groups.json index 1b27188c60..de1199e618 100644 --- a/public/language/da/groups.json +++ b/public/language/da/groups.json @@ -28,6 +28,7 @@ "details.grant": "Giv/ophæv ejerskab", "details.kick": "Spark", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Gruppe administration", "details.group_name": "Gruppe navn", "details.member_count": "Medlemsantal", diff --git a/public/language/da/pages.json b/public/language/da/pages.json index ae8dfe53be..9f55236e13 100644 --- a/public/language/da/pages.json +++ b/public/language/da/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populære tråde denne måned", "popular-alltime": "Top populære tråde", "recent": "Seneste tråde", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/da/user.json b/public/language/da/user.json index 8ae92e0ae6..b63ae7ff50 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -31,6 +31,8 @@ "following": "Følger", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Om mig", "signature": "Signatur", "birthday": "Fødselsdag", @@ -107,7 +109,9 @@ "no-sound": "Ingen lyd", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Gennemsenings indstillinger", diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index 06eafb179f..fe33477e54 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB wird mit einem Modul geliefert, welches automatisch anfragen in High-Traffic Situationen blockiert. Du kannst diese Einstellungen hier ändern, auch wenn die Standardeinstellungen einen guten Anfang darstellen sollten", "traffic.enable": "Traffic Management aktivieren", diff --git a/public/language/de/admin/settings/uploads.json b/public/language/de/admin/settings/uploads.json index 3cef701783..be4f158581 100644 --- a/public/language/de/admin/settings/uploads.json +++ b/public/language/de/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Beiträge", "allow-files": "Nutzern erlauben normale Dateien hochzuladen", "private": "Hochgeladene Dateien privatisieren", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Bilder zu einer bestimmten Breite runterskalieren", "max-image-width-help": "(in Pixeln, standard 760 pixel, auf 0 setzen um zu deaktivieren)", "resize-image-quality": "Zu benutzende Qualität beim verändern von Bildauflösungen", diff --git a/public/language/de/email.json b/public/language/de/email.json index eb8b558461..2c716c8d5c 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -4,6 +4,8 @@ "invite": "Einladung von %1", "greeting_no_name": "Hallo", "greeting_with_name": "Hallo %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Vielen Dank für die Registrierung bei %1!", "welcome.text2": "Um dein Konto vollständig zu aktivieren, müssen wir überprüfen, ob du Besitzer der E-Mail-Adresse bist, mit der du dich registriert hast.", "welcome.text3": "Ein Administrator hat deine Registrierung aktzeptiert. Du kannst dich jetzt mit deinem Benutzernamen/Passwort einloggen.", diff --git a/public/language/de/groups.json b/public/language/de/groups.json index ef732cb084..83f53237ab 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -28,6 +28,7 @@ "details.grant": "Gewähre/widerrufe Besitz", "details.kick": "Kick", "details.kick_confirm": "Sind Sie sicher, dass Sie dieses Mitglied aus der Gruppe entfernen möchten?", + "details.add-member": "Add Member", "details.owner_options": "Gruppenadministration", "details.group_name": "Gruppenname", "details.member_count": "Mitgliederanzahl", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 96e04e927c..9bf0bb6aa7 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -6,7 +6,10 @@ "popular-month": "Beliebte Themen dieses Monats", "popular-alltime": "Beliebteste Themen", "recent": "Neueste Themen", - "top": "Bestbewertetste Themen", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator-Werkzeuge", "flagged-content": "Gemeldeter Inhalt", "ip-blacklist": "IP Blacklist", diff --git a/public/language/de/user.json b/public/language/de/user.json index 53a22b7cbc..953a661fc9 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -31,6 +31,8 @@ "following": "Folge ich", "blocks": "Blockiert", "block_toggle": "Ent-/Blocken", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Über mich", "signature": "Signatur", "birthday": "Geburtstag", @@ -107,7 +109,9 @@ "no-sound": "Kein Ton", "upvote-notif-freq": "Benachrichtigungshäufigkeit für positive Bewertungen", "upvote-notif-freq.all": "Alle positiven Bewertungen", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Alle 10 positiven Bewertungen", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Bei 10, 100, 1000...", "upvote-notif-freq.disabled": "Deaktiviert", "browsing": "Browsing", diff --git a/public/language/el/admin/settings/advanced.json b/public/language/el/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/el/admin/settings/advanced.json +++ b/public/language/el/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/el/admin/settings/uploads.json b/public/language/el/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/el/admin/settings/uploads.json +++ b/public/language/el/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/el/email.json b/public/language/el/email.json index 079ef0f5f0..95152debb8 100644 --- a/public/language/el/email.json +++ b/public/language/el/email.json @@ -4,6 +4,8 @@ "invite": "Invitation from %1", "greeting_no_name": "Γειά σου", "greeting_with_name": "Γειά σου %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Ευχαριστούμε που γράφτηκες στο %1!", "welcome.text2": "Για να ενεργοποιήσεις πλήρως τον λογαριασμό σου, πρέπει να επιβεβαιώσουμε πως η διεύθυνση email με την οποια γράφτηκες σου ανήκει.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/el/groups.json b/public/language/el/groups.json index 7c19a8733e..ad68e248e9 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/el/pages.json b/public/language/el/pages.json index cedd9a064a..f641a71a8b 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Πρόσφατα Θέματα", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/el/user.json b/public/language/el/user.json index 01dc3846a3..1928393015 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -31,6 +31,8 @@ "following": "Ακολουθά", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Υπογραφή", "birthday": "Γενέθλια", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Επιλογές Περιήγησης", diff --git a/public/language/en-US/admin/settings/advanced.json b/public/language/en-US/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/en-US/admin/settings/advanced.json +++ b/public/language/en-US/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/en-US/admin/settings/uploads.json b/public/language/en-US/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/en-US/admin/settings/uploads.json +++ b/public/language/en-US/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/en-US/email.json b/public/language/en-US/email.json index 5172a0ecb6..b639351dff 100644 --- a/public/language/en-US/email.json +++ b/public/language/en-US/email.json @@ -4,6 +4,8 @@ "invite": "Invitation from %1", "greeting_no_name": "Hello", "greeting_with_name": "Hello %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Thank you for registering with %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/en-US/groups.json b/public/language/en-US/groups.json index e0067b7d16..ede85d0834 100644 --- a/public/language/en-US/groups.json +++ b/public/language/en-US/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/en-US/pages.json b/public/language/en-US/pages.json index c05cc250aa..479a8acb0d 100644 --- a/public/language/en-US/pages.json +++ b/public/language/en-US/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Recent Topics", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/en-US/user.json b/public/language/en-US/user.json index d9b40b7ba3..b357a076e9 100644 --- a/public/language/en-US/user.json +++ b/public/language/en-US/user.json @@ -31,6 +31,8 @@ "following": "Following", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Signature", "birthday": "Birthday", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", diff --git a/public/language/en-x-pirate/admin/settings/advanced.json b/public/language/en-x-pirate/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/en-x-pirate/admin/settings/advanced.json +++ b/public/language/en-x-pirate/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/en-x-pirate/admin/settings/uploads.json b/public/language/en-x-pirate/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/en-x-pirate/admin/settings/uploads.json +++ b/public/language/en-x-pirate/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/en-x-pirate/email.json b/public/language/en-x-pirate/email.json index ecfbd03e79..f2ecdf8a42 100644 --- a/public/language/en-x-pirate/email.json +++ b/public/language/en-x-pirate/email.json @@ -4,6 +4,8 @@ "invite": "Ye be invited by %1", "greeting_no_name": "Hello", "greeting_with_name": "Hello %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Thank you for registering with %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/en-x-pirate/groups.json b/public/language/en-x-pirate/groups.json index 9b6fd4b241..c4584e9270 100644 --- a/public/language/en-x-pirate/groups.json +++ b/public/language/en-x-pirate/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/en-x-pirate/pages.json b/public/language/en-x-pirate/pages.json index c05cc250aa..479a8acb0d 100644 --- a/public/language/en-x-pirate/pages.json +++ b/public/language/en-x-pirate/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Recent Topics", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/en-x-pirate/user.json b/public/language/en-x-pirate/user.json index ea6c4cc6d2..2fd660a8fd 100644 --- a/public/language/en-x-pirate/user.json +++ b/public/language/en-x-pirate/user.json @@ -31,6 +31,8 @@ "following": "Following", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Signature", "birthday": "Birthday", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index 04c7ef39e1..1bd0a7a830 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Credenciales-Control-Permitir-Acceso", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Administración de Tráfico", "traffic.help": "NodeBB se despliega equipado con un módulo que deniega automáticamente requests de HTTP en situaciones de tráfico alto. Puedes ajustar esta configuración aquí, aunque los valores por defecto son un punto de partida aceptable.", "traffic.enable": "Habilitar Administración de Tráfico", diff --git a/public/language/es/admin/settings/uploads.json b/public/language/es/admin/settings/uploads.json index 9fe409a1ab..1a5dae8d4e 100644 --- a/public/language/es/admin/settings/uploads.json +++ b/public/language/es/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Mensajes", "allow-files": "Permitir a los usuarios subir archivos habituales", "private": "Hacer las subidas de archivos privadas", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Redimensionar las imágenes a la anchura especificada (en píxeles)", "max-image-width-help": "(en píxeles, por defecto: 760 píxeles, poner a 0 para desactivar)", "resize-image-quality": "Calidad a utlizar cuando se redimensionen imágenes", diff --git a/public/language/es/email.json b/public/language/es/email.json index ca907fa06f..ba23ca4859 100644 --- a/public/language/es/email.json +++ b/public/language/es/email.json @@ -4,6 +4,8 @@ "invite": "Invitación de %1", "greeting_no_name": "Hola", "greeting_with_name": "Hola %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Gracias por registrarte con %1!", "welcome.text2": "Para activar completamente tu cuenta, necesitamos verificar que la dirección email con la que te registraste te pertenece.", "welcome.text3": "El administrador ha aceptado tu registro. Puedes acceder con tu usuario/contraseña ahora.", diff --git a/public/language/es/groups.json b/public/language/es/groups.json index b6e987ad0d..2f0dcef3cb 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -28,6 +28,7 @@ "details.grant": "Conceder/Rescindir Propiedad", "details.kick": "Expulsar", "details.kick_confirm": "¿ Estás seguro de que quieres eliminar a este miembro del grupo ?", + "details.add-member": "Add Member", "details.owner_options": "Administración De Grupo", "details.group_name": "Nombre de Grupo", "details.member_count": "Numero de Miembros", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index 02d7e5eac4..397db27558 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -6,7 +6,10 @@ "popular-month": "Temas populares del mes", "popular-alltime": "Temas populares de siempre", "recent": "Temas recientes", - "top": "Temas Más Votados", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Herramientas de Moderadores", "flagged-content": "Contenido reportado", "ip-blacklist": "Lista negra de IPS", diff --git a/public/language/es/user.json b/public/language/es/user.json index 3003cb0e6b..5592def4f2 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -31,6 +31,8 @@ "following": "Siguiendo", "blocks": "Bloqueos", "block_toggle": "Cambiar Bloqueo", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Sobre mí", "signature": "Firma", "birthday": "Cumpleaños", @@ -107,7 +109,9 @@ "no-sound": "Sin sonido", "upvote-notif-freq": "Frecuencia de notificación de votos positivos", "upvote-notif-freq.all": "Todos los Votos Positivos", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Cada Diez Votos Positivos", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "A los 10, 100, 1000...", "upvote-notif-freq.disabled": "Desactivado", "browsing": "Preferencias de navegación.", diff --git a/public/language/et/admin/settings/advanced.json b/public/language/et/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/et/admin/settings/advanced.json +++ b/public/language/et/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/et/admin/settings/uploads.json b/public/language/et/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/et/admin/settings/uploads.json +++ b/public/language/et/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/et/email.json b/public/language/et/email.json index c294189c11..1bd3d95060 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -4,6 +4,8 @@ "invite": "Kutse %1-lt", "greeting_no_name": "Tere", "greeting_with_name": "Tere %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Täname et oled registreerinud %1 foorumisse!", "welcome.text2": "Konto täielikuks aktiveerimiseks peame me kinnitama, et registreerimisel kasutatud e-mail kuulub teile.", "welcome.text3": "Administraator aktsepteeris teie registreerimise. Te saate nüüd sisse logida oma kasutajanime/parooliga.", diff --git a/public/language/et/groups.json b/public/language/et/groups.json index fb0f842390..8e2d6e0366 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -28,6 +28,7 @@ "details.grant": "Anna/võta omanikuõigused", "details.kick": "Viska välja", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Grupi haldamine", "details.group_name": "Grupi nimi", "details.member_count": "Liikmete arv", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index da6beadad8..5d05756d29 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populaarsed teemad sel kuul", "popular-alltime": "Populaarseimad teemad üldse", "recent": "Hiljutised teemad", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/et/user.json b/public/language/et/user.json index 11997d1a4f..d6b8a44b9e 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -31,6 +31,8 @@ "following": "Jälgimised", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Minust", "signature": "Allkiri", "birthday": "Sünnipäev", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Sirvimis sätted", diff --git a/public/language/fa-IR/admin/settings/advanced.json b/public/language/fa-IR/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/fa-IR/admin/settings/advanced.json +++ b/public/language/fa-IR/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/fa-IR/admin/settings/uploads.json b/public/language/fa-IR/admin/settings/uploads.json index 8e92cff45a..f66fbfbe7a 100644 --- a/public/language/fa-IR/admin/settings/uploads.json +++ b/public/language/fa-IR/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "پست‌ها", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/fa-IR/email.json b/public/language/fa-IR/email.json index da5a980672..223644dce4 100644 --- a/public/language/fa-IR/email.json +++ b/public/language/fa-IR/email.json @@ -4,6 +4,8 @@ "invite": "دعوتنامه از %1", "greeting_no_name": "سلام", "greeting_with_name": "سلام %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "متشکریم بابت ثبت نام در %1!", "welcome.text2": "برای فعال کردن کامل اکانت شما، ما نیاز داریم تا اطمینان حاصل کنیم که شما مالک ایمیلی که با ان ثبت نام کردید هستید.", "welcome.text3": "ِک مدیر درخواست ثبت نام شما را قبول کرده. اکنون میتوانید با نام کاربری/رمز عبور خود وارد شوید", diff --git a/public/language/fa-IR/groups.json b/public/language/fa-IR/groups.json index 49a126559c..5f9ceab6e3 100644 --- a/public/language/fa-IR/groups.json +++ b/public/language/fa-IR/groups.json @@ -28,6 +28,7 @@ "details.grant": "اعطاء/خلع مالکیت", "details.kick": "بیرون انداختن", "details.kick_confirm": "آیا شما مطمئن هستید که می خواهید این عضو از گروه را حذف کنید؟", + "details.add-member": "Add Member", "details.owner_options": "مدیر گروه", "details.group_name": "نام گروه", "details.member_count": "تعداد اعضا", diff --git a/public/language/fa-IR/pages.json b/public/language/fa-IR/pages.json index 2465faa7ba..5240f5743f 100644 --- a/public/language/fa-IR/pages.json +++ b/public/language/fa-IR/pages.json @@ -6,7 +6,10 @@ "popular-month": "موضوعات پربازدید این ماه", "popular-alltime": "پربازدیدترین موضوعات", "recent": "موضوع‌های تازه", - "top": "موضوعات دارای بیشترین رای", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "ابزار مدیران", "flagged-content": "محتوای گزارش شده", "ip-blacklist": "لیست سیاه آی‌پی", diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 598b3449d8..8c5f23274d 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -31,6 +31,8 @@ "following": "دنبال‌شونده‌ها", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "درباره ی من", "signature": "امضا", "birthday": "روز تولد", @@ -107,7 +109,9 @@ "no-sound": "بدون صدا", "upvote-notif-freq": "تنظیمات اعلان امتیاز مثبت", "upvote-notif-freq.all": "همه امتیاز های مثبت", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "هر ده امتیاز مثبت", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "هر 10، 10، 1000 ...", "upvote-notif-freq.disabled": "Disabled", "browsing": "تنظیمات مرور", diff --git a/public/language/fi/admin/settings/advanced.json b/public/language/fi/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/fi/admin/settings/advanced.json +++ b/public/language/fi/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/fi/admin/settings/uploads.json b/public/language/fi/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/fi/admin/settings/uploads.json +++ b/public/language/fi/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/fi/email.json b/public/language/fi/email.json index 9361bb0113..cc02f42b37 100644 --- a/public/language/fi/email.json +++ b/public/language/fi/email.json @@ -4,6 +4,8 @@ "invite": "Kutsu henkilöltä %1", "greeting_no_name": "Hei", "greeting_with_name": "Hei %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Kiitos rekisteröitymisestäsi sivustolle %1!", "welcome.text2": "Meidän täytyy varmistaa, että omistat sen sähköpostiosoitteen, jolla rekisteröidyit, ennen kuin tilisi voidaan aktivoida kokonaan.", "welcome.text3": "Ylläpitäjä hyväksyi rekisteröintipyyntösi. Voit nyt kirjautua käyttäjänimelläsi ja salasanallasi.", diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json index 8747c3c5bd..053eef26a5 100644 --- a/public/language/fi/groups.json +++ b/public/language/fi/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Potkaise", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index d68b4aa497..346324a15a 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -6,7 +6,10 @@ "popular-month": "Suositut aiheet tässä kuussa", "popular-alltime": "Suositut aiheet koko ajalta", "recent": "Viimeisimmät aiheet", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 4233ee0959..eb7f12861a 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -31,6 +31,8 @@ "following": "Seuratut", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Allekirjoitus", "birthday": "Syntymäpäivä", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Selataan asetuksia", diff --git a/public/language/fr/admin/settings/advanced.json b/public/language/fr/admin/settings/advanced.json index f0cfd08de6..59428e93e4 100644 --- a/public/language/fr/admin/settings/advanced.json +++ b/public/language/fr/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "\nAccess-Control-Allow-Methods", "headers.acah": "\nAccess-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Inclure les sous-domaines dans l'en-tête HSTS", + "hsts.preload": "Autoriser le préchargement de l'en-tête HSTS", + "hsts.help": "Un en-tête HSTS est déjà pré-configuré pour ce site. Vous pouvez choisir d'inclure des sous-domaines et des indicateurs de préchargement dans votre en-tête. En cas de doute, vous pouvez les laisser non cochés. Plus d'informations", "traffic-management": "Gestion du trafic", "traffic.help": "NodeBB est déployé équipé d'un module qui refuse les requêtes en cas de situation de haut traffic. Vous pouvez changer les paramètres ici, bien que les paramètres par défaut sont un bon commencement.", "traffic.enable": "Activé la gestion du trafic", diff --git a/public/language/fr/admin/settings/uploads.json b/public/language/fr/admin/settings/uploads.json index 3e929f29b0..487c011cc3 100644 --- a/public/language/fr/admin/settings/uploads.json +++ b/public/language/fr/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Sujets", "allow-files": "Autoriser les utilisateurs à télécharger des fichiers standards", "private": "Rendre privés les fichiers téléchargés", + "private-extensions": "Rendre privé des extensions de fichier.", + "private-uploads-extensions-help": "Renseignez ici une liste d'extensions de fichiers séparées par des virgules pour les rendre privées (par exemple : pdf, xls, doc). Une liste vide signifie que tous les fichiers sont privés.", "max-image-width": "Redimensionner les images à une largeur spécifique (en pixels)", "max-image-width-help": "(En pixels, par défaut : 760 pixels, définir à 0 si désactivé)", "resize-image-quality": "Qualité utilisée des images redimensionnées", diff --git a/public/language/fr/email.json b/public/language/fr/email.json index ad081c2fec..a3f7d6657d 100644 --- a/public/language/fr/email.json +++ b/public/language/fr/email.json @@ -4,6 +4,8 @@ "invite": "Invitation de %1", "greeting_no_name": "Bonjour", "greeting_with_name": "Bonjour %1", + "email.verify-your-email.subject": "Veuillez vérifier votre Email", + "email.verify.text1": "Votre adresse mail a changée !", "welcome.text1": "Merci de vous être inscrit sur %1!", "welcome.text2": "Pour activer totalement votre compte, nous devons vérifier que vous êtes bien propriétaire de l'adresse email que vous avez utilisé pour vous inscrire.", "welcome.text3": "Un administrateur a accepté votre demande d'inscription. Vous pouvez maintenant vous connecter avec vos identifiants/mots de passe.", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 84bcf7a529..3f22d69bde 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -28,6 +28,7 @@ "details.grant": "Promouvoir/rétrograder comme propriétaire", "details.kick": "Exclure", "details.kick_confirm": "Voulez-vous vraiment supprimer ce membre du groupe ?", + "details.add-member": "Ajouter un membre", "details.owner_options": "Administration du groupe", "details.group_name": "Nom du groupe", "details.member_count": "Nombre de membres", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 70af1102ae..b95439e55c 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -6,7 +6,10 @@ "popular-month": "Sujets populaires ce mois-ci", "popular-alltime": "Sujets populaires depuis toujours", "recent": "Sujets récents", - "top": "Top des sujets votés", + "top-day": "Meilleurs votes du jour", + "top-week": "Meilleurs votes de la semaine", + "top-month": "Meilleurs votes du mois", + "top-alltime": "Sujets les mieux notés", "moderator-tools": "Outils de modération", "flagged-content": "Contenu signalé", "ip-blacklist": "Liste noire d'adresses IP", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 5a494225a7..f3d1b1f9e9 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -31,6 +31,8 @@ "following": "Abonnements", "blocks": "Bloqués", "block_toggle": "Débloquer", + "block_user": "Bloquer un utilisateur", + "unblock_user": "Débloquer un utilisateur", "aboutme": "À propos de moi", "signature": "Signature", "birthday": "Anniversaire", @@ -107,7 +109,9 @@ "no-sound": "Pas de son", "upvote-notif-freq": "Fréquence de notification des votes positif", "upvote-notif-freq.all": "Tout les votes positif", + "upvote-notif-freq.first": "En premier", "upvote-notif-freq.everyTen": "Le top 10 des votes positif", + "upvote-notif-freq.threshold": "Sur 1, 5, 10, 25, 50, 100, 150, 200 ...", "upvote-notif-freq.logarithmic": "Les 10, 100, 1000...", "upvote-notif-freq.disabled": "Désactivé", "browsing": "Paramètres de navigation", diff --git a/public/language/gl/admin/settings/advanced.json b/public/language/gl/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/gl/admin/settings/advanced.json +++ b/public/language/gl/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/gl/admin/settings/uploads.json b/public/language/gl/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/gl/admin/settings/uploads.json +++ b/public/language/gl/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/gl/email.json b/public/language/gl/email.json index 6d6e5eda36..391115d818 100644 --- a/public/language/gl/email.json +++ b/public/language/gl/email.json @@ -4,6 +4,8 @@ "invite": "Invitación de %1", "greeting_no_name": "Ola", "greeting_with_name": "Ola %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Grazas por rexistrarte %1!", "welcome.text2": "Para activar a túa conta, precisamos que a verifiques co enderezo de correo electrónico co que te rexistraches. ", "welcome.text3": "Un administrador aceptou a túa solicitude de rexistro. Agora pódeste conectar co teu nome de usuario e contrasinal. ", diff --git a/public/language/gl/groups.json b/public/language/gl/groups.json index 378e9c2978..c112c167f7 100644 --- a/public/language/gl/groups.json +++ b/public/language/gl/groups.json @@ -28,6 +28,7 @@ "details.grant": "Outorgar/Rescindir propiedade", "details.kick": "Expulsar", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Administración do Grupo", "details.group_name": "Nome do Grupo", "details.member_count": "Conta de Membros", diff --git a/public/language/gl/pages.json b/public/language/gl/pages.json index d960a950ae..c3f95d84b0 100644 --- a/public/language/gl/pages.json +++ b/public/language/gl/pages.json @@ -6,7 +6,10 @@ "popular-month": "Temas populares do mes", "popular-alltime": "Temas populares de tódolos tempos", "recent": "Temas recentes", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPs", diff --git a/public/language/gl/user.json b/public/language/gl/user.json index 503b967bff..7dfa22f139 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -31,6 +31,8 @@ "following": "Seguindo", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Sobre min", "signature": "Firma", "birthday": "Aniversario", @@ -107,7 +109,9 @@ "no-sound": "Sen son", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Opcións de busca", diff --git a/public/language/he/admin/settings/advanced.json b/public/language/he/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/he/admin/settings/advanced.json +++ b/public/language/he/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/he/admin/settings/uploads.json b/public/language/he/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/he/admin/settings/uploads.json +++ b/public/language/he/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/he/email.json b/public/language/he/email.json index 635aa7cd5a..029b6735cc 100644 --- a/public/language/he/email.json +++ b/public/language/he/email.json @@ -4,6 +4,8 @@ "invite": "הזמנה מ%1", "greeting_no_name": "שלום", "greeting_with_name": "שלום %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "תודה שנרשמת ל%1!", "welcome.text2": "על מנת להפעיל את החשבון שלך, אנו צריכים לוודא שאתה בעל חשבון המייל שנרשמת איתו.", "welcome.text3": "מנהל אישר את ההרשמה שלך.\nאתה יכול להתחבר עם השם משתמש והסיסמא שלך מעכשיו.", diff --git a/public/language/he/groups.json b/public/language/he/groups.json index 5be31f9d39..255fb3eedd 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -28,6 +28,7 @@ "details.grant": "הענק/בטל בעלות", "details.kick": "גרש", "details.kick_confirm": "האם אתה בטוח שאתה רוצה להסיר משתמש זה מהקבוצה?", + "details.add-member": "Add Member", "details.owner_options": "ניהול הקבוצה", "details.group_name": "שם הקבוצה", "details.member_count": "כמות משתמשים", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index ce5b25e366..bf6bd17348 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -6,7 +6,10 @@ "popular-month": "נושאים חמים החודש", "popular-alltime": "הנושאים החמים בכל הזמנים", "recent": "נושאים אחרונים", - "top": "הנושאים הנבחרים ביותר", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "כלי מודרטור", "flagged-content": "תוכן מדווח", "ip-blacklist": "רשימת IP שחורה", diff --git a/public/language/he/user.json b/public/language/he/user.json index e94394d450..bdb697e0a2 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -31,6 +31,8 @@ "following": "עוקב אחרי", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "אודותי", "signature": "חתימה", "birthday": "יום הולדת", @@ -107,7 +109,9 @@ "no-sound": "ללא צליל", "upvote-notif-freq": "תדירות התראת הצבעה חיובית", "upvote-notif-freq.all": "כל ההצבעות החיוביות", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "כל 10 הצבעות חיוביות", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "ב10, 100, 1000...", "upvote-notif-freq.disabled": "מבוטל", "browsing": "הגדרות צפייה", diff --git a/public/language/hr/admin/settings/advanced.json b/public/language/hr/admin/settings/advanced.json index 414ee2930c..a44ae02df8 100644 --- a/public/language/hr/admin/settings/advanced.json +++ b/public/language/hr/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Upravljanje prometom", "traffic.help": "NodeBB koristi modul koji automatski odbija zahtjeve u situacijama visokog prometa.Možete ove postavke izmjeniti ovdje,iako su već zadane postavke dobra početna točka.", "traffic.enable": "Omogući upravljanje prometom", diff --git a/public/language/hr/admin/settings/uploads.json b/public/language/hr/admin/settings/uploads.json index a9b28e6eba..353155b813 100644 --- a/public/language/hr/admin/settings/uploads.json +++ b/public/language/hr/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Objave", "allow-files": "Dozvoli korisnicima učitavanje regularnih datoteka", "private": "Učini datoteke privatnim", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Promjeni veličinu slike na zadanu širinu (u pikselima)", "max-image-width-help": "(u pixelima,zadano:760 pixela,upiši 0 za onemogućiti opciju)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/hr/email.json b/public/language/hr/email.json index d54d73c12c..587e7ae0ba 100644 --- a/public/language/hr/email.json +++ b/public/language/hr/email.json @@ -4,6 +4,8 @@ "invite": "Poziv s %1", "greeting_no_name": "Zdravo", "greeting_with_name": "Zdravo %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Zahvaljujemo na registraciji na %1!", "welcome.text2": "Da bi u potpunosti aktivirali Vaš račun, moramo provjeriti da li ste Vi pravi vlasnik email adrese sa kojom ste se registrirali.", "welcome.text3": "Administrator je prihvatio vaš zahtjev za registraciju. Možete se prijaviti koristeći svoje korisničko ime i lozinku.", diff --git a/public/language/hr/groups.json b/public/language/hr/groups.json index a27c0cc6c9..d398746fe7 100644 --- a/public/language/hr/groups.json +++ b/public/language/hr/groups.json @@ -28,6 +28,7 @@ "details.grant": "Dozvoli/Ukini vlasništvo", "details.kick": "Izbaci", "details.kick_confirm": "Jeste li sigurni da želite izbaciti ovog člana iz grupe?", + "details.add-member": "Add Member", "details.owner_options": "\"Administracija grupe", "details.group_name": "Ime grupe", "details.member_count": "Broj članova", diff --git a/public/language/hr/pages.json b/public/language/hr/pages.json index 13ff8dbe54..548622599c 100644 --- a/public/language/hr/pages.json +++ b/public/language/hr/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popularne teme ovaj mjesec", "popular-alltime": "Najpopularnije teme ", "recent": "Nedavne teme", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Označene objave", "ip-blacklist": "IP crna lista", diff --git a/public/language/hr/user.json b/public/language/hr/user.json index f864253018..da67723690 100644 --- a/public/language/hr/user.json +++ b/public/language/hr/user.json @@ -31,6 +31,8 @@ "following": "Prati", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "O meni", "signature": "Potpis", "birthday": "Rođendan", @@ -107,7 +109,9 @@ "no-sound": "Bez zvuka", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Postavke pretraživanja", diff --git a/public/language/hu/admin/settings/advanced.json b/public/language/hu/admin/settings/advanced.json index eb57066548..8050738c01 100644 --- a/public/language/hu/admin/settings/advanced.json +++ b/public/language/hu/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Forgalomirányítás", "traffic.help": "A NodeBB egy, a kéréseket nagy forgalmú helyzetekben automatikusan elutasító modullal felszerelve vonul fel. Átállíthatod ezen opciókat, habár az alapértékek egy remek kiinduló pont.", "traffic.enable": "Forgalomirányítás engedélyezése", diff --git a/public/language/hu/admin/settings/uploads.json b/public/language/hu/admin/settings/uploads.json index 578af1a694..fb1c7c7cc7 100644 --- a/public/language/hu/admin/settings/uploads.json +++ b/public/language/hu/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Hozzászólások", "allow-files": "Szokásos fájlok feltöltésének engedélyezése a felhasználók számára", "private": "Feltöltött fájlok priváttá tevése", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Képek méretének csökkentése megadott szélességre (pixelben)", "max-image-width-help": "(pixelben, alapérték: 760 pixel, 0-ra állítva letiltódik)", "resize-image-quality": "Használandó minőség képek átméretezésekor", diff --git a/public/language/hu/email.json b/public/language/hu/email.json index 00ea6dd210..1ec0454153 100644 --- a/public/language/hu/email.json +++ b/public/language/hu/email.json @@ -4,6 +4,8 @@ "invite": "Meghívó a(z) %1 oldalra", "greeting_no_name": "Helló", "greeting_with_name": "Helló %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Köszönjük a regisztrációt %1!", "welcome.text2": "A fiók aktiválásához ellenőriznünk kell, hogy valós e-mail cím lett e megadva.", "welcome.text3": "Egy adminisztrátor elfogadta a regisztrációdat. Mostantól a felhasználónév/jelszó párosoddal be tudsz lépni.", diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index 436de24158..ccbb68bebb 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -28,6 +28,7 @@ "details.grant": "Tulajdonjog megadása/törlése", "details.kick": "Kirúgás", "details.kick_confirm": "Biztos el akarod távolítani ezt a tagot a csoportból?", + "details.add-member": "Add Member", "details.owner_options": "Csoportadminisztrátor", "details.group_name": "Csoport neve", "details.member_count": "Tagok száma", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index eb78a2414c..7ac7e3eeea 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -6,7 +6,10 @@ "popular-month": "Havi népszerű témakörök", "popular-alltime": "Mindenkori legnépszerűbb témakörök", "recent": "Legfrissebb témakörök", - "top": "Legtöbb szavazatot kapott témakörök", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderátori eszközök", "flagged-content": "Megjelölt tartalom", "ip-blacklist": "IP tiltólista", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index a00039f85e..bcef0b5e44 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -31,6 +31,8 @@ "following": "Követve", "blocks": "Blokkolások", "block_toggle": "Blokkolás ki-/bekapcsolása", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Rólam", "signature": "Aláírás", "birthday": "Születésnap", @@ -107,7 +109,9 @@ "no-sound": "Nincs hang", "upvote-notif-freq": "Kedvelési értesítés gyakorisága", "upvote-notif-freq.all": "Összes kedvelés", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Minden tizedik kedvelés", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "10, 100, 1000...", "upvote-notif-freq.disabled": "Kikapcsolva", "browsing": "Böngészési beállítások", diff --git a/public/language/id/admin/settings/advanced.json b/public/language/id/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/id/admin/settings/advanced.json +++ b/public/language/id/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/id/admin/settings/uploads.json b/public/language/id/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/id/admin/settings/uploads.json +++ b/public/language/id/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/id/email.json b/public/language/id/email.json index b379815449..9ac7544bc7 100644 --- a/public/language/id/email.json +++ b/public/language/id/email.json @@ -4,6 +4,8 @@ "invite": "Undangan dari %1", "greeting_no_name": "Hai", "greeting_with_name": "Hai %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Terima kasih anda telah mendaftarkan diri anda dengan %1!", "welcome.text2": "Untuk mengaktifkan akun anda sepenuhnya, kami perlu memverifkasi bahwa anda adalah pemilik email yang terdaftar.", "welcome.text3": "Administrator telah menerima aplikasi pendaftaran anda. Anda dapat masuk dengan username/password anda sekarang", diff --git a/public/language/id/groups.json b/public/language/id/groups.json index f9820f0c7b..b54b259856 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index a8dd34f65b..ffb2fecbab 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Topik Terkini", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/id/user.json b/public/language/id/user.json index c8ea8fb1a2..3e2bcdc40e 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -31,6 +31,8 @@ "following": "Mengikuti", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Tanda Pengenal", "birthday": "Hari Lahir", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Pengaturan Penelusuran", diff --git a/public/language/it/admin/settings/advanced.json b/public/language/it/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/it/admin/settings/advanced.json +++ b/public/language/it/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/it/admin/settings/uploads.json b/public/language/it/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/it/admin/settings/uploads.json +++ b/public/language/it/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/it/email.json b/public/language/it/email.json index 04fdf6209b..bdfb2efbab 100644 --- a/public/language/it/email.json +++ b/public/language/it/email.json @@ -4,6 +4,8 @@ "invite": "Invito da %1", "greeting_no_name": "Ciao", "greeting_with_name": "Ciao %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Grazie per esserti registrato su %1!", "welcome.text2": "Per attivare completamente il tuo account dobbiamo verificare che sei il proprietario dell'indirizzo email con cui ti sei registrato.", "welcome.text3": "Un amministratore ha accettato la tua registrazione. Adesso puoi collegarti con il tuo nome utente/password.", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 53f27c12c4..cc2db3577f 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -28,6 +28,7 @@ "details.grant": "Concedi / Rimuovi la Proprietà", "details.kick": "Espelli", "details.kick_confirm": "Sei sicuro di voler rimuovere questo membro dal gruppo?", + "details.add-member": "Add Member", "details.owner_options": "Amministratore del Grupo", "details.group_name": "Nome Gruppo", "details.member_count": "Totale Membri", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 0787658c2c..f893828a7e 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -6,7 +6,10 @@ "popular-month": "Discussioni popolari questo mese", "popular-alltime": "Discussioni più popolari di sempre", "recent": "Discussioni Recenti", - "top": "Discussioni più votate", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Strumenti di moderazione", "flagged-content": "Contenuti Segnalati", "ip-blacklist": "Lista nera degli IP", diff --git a/public/language/it/user.json b/public/language/it/user.json index 9ffd6957d3..59d9b7d278 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -31,6 +31,8 @@ "following": "Chi segue", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Su di me", "signature": "Firma", "birthday": "Data di nascita", @@ -107,7 +109,9 @@ "no-sound": "Nessun suono", "upvote-notif-freq": "Frequenza Notifiche dei Mi Piace ", "upvote-notif-freq.all": "Tutti i Mi Piace", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Ogni Dieci Mi Piace", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Ogni 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabilitate", "browsing": "Impostazioni di Navigazione", diff --git a/public/language/ja/admin/settings/advanced.json b/public/language/ja/admin/settings/advanced.json index 72bfd7e2f6..2d4da1813b 100644 --- a/public/language/ja/admin/settings/advanced.json +++ b/public/language/ja/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "アクセス-制御-有効-メソッド", "headers.acah": "アクセス-制御-有効-ヘッダー", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "トラフィック管理", "traffic.help": "NodeBBは、トラフィックの多い状況で要求を自動的に拒否するモジュールを備えています。これらの設定はここで調整することができますが、はじめはデフォルト設定にしておくことをお勧めします。", "traffic.enable": "トラフィック管理を有効にする", diff --git a/public/language/ja/admin/settings/uploads.json b/public/language/ja/admin/settings/uploads.json index 7ae1585d43..e093319a6e 100644 --- a/public/language/ja/admin/settings/uploads.json +++ b/public/language/ja/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "投稿", "allow-files": "ユーザーが通常のファイルをアップロードできるようにする。", "private": "アップロードしたファイルを非公開にする", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "画像を指定した幅(ピクセル単位)にリサイズ", "max-image-width-help": "(ピクセル単位、デフォルト:760px、無効にするには0に設定)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ja/email.json b/public/language/ja/email.json index 6ed3b99baf..0685b075a8 100644 --- a/public/language/ja/email.json +++ b/public/language/ja/email.json @@ -4,6 +4,8 @@ "invite": "%1からの招待です", "greeting_no_name": "こんにちは", "greeting_with_name": "%1さん、こんにちは", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "%1に登録していただき、ありがとうございます!", "welcome.text2": "あなたのアカウントを完全に有効化するには、アドレスが正しいことを確認する必要があります。", "welcome.text3": "管理者があなたの登録申請を承認しました。これから、自分のユーザ名とパスワードでログインできます。", diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index 53d1cc1cfb..b348a6b5de 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -28,6 +28,7 @@ "details.grant": "寄贈/取り消す管理権限", "details.kick": "キック", "details.kick_confirm": "このメンバーをグループから削除", + "details.add-member": "Add Member", "details.owner_options": "グループの管理", "details.group_name": "グループ名", "details.member_count": "メンバー数", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index 3a699b5957..f1ab48e018 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -6,7 +6,10 @@ "popular-month": "今月人気のスレッド", "popular-alltime": "人気のスレッド", "recent": "最新スレッド", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "モデレーターツール", "flagged-content": "フラグ付きコンテンツ", "ip-blacklist": "IPブラックリスト", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 1a5196d935..ce27b42f73 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -31,6 +31,8 @@ "following": "フォロー中", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "署名", "birthday": "誕生日", @@ -107,7 +109,9 @@ "no-sound": "無音", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "ブラウジングの設定", diff --git a/public/language/ko/admin/settings/advanced.json b/public/language/ko/admin/settings/advanced.json index cf8b7c3e53..fd25778e4a 100644 --- a/public/language/ko/admin/settings/advanced.json +++ b/public/language/ko/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "트래픽 관리", "traffic.help": "NodeBB는 트래픽이 많은 상황에서는 자동으로 리퀘스트를 거부하는 모듈을 가지고 있습니다. 이에 관련된 세팅은 디폴트 값들도 괜찮지만, 여기서 세부 조율도 가능합니다.", "traffic.enable": "트래픽 관리 허용", diff --git a/public/language/ko/admin/settings/uploads.json b/public/language/ko/admin/settings/uploads.json index c693791094..7c5f126a18 100644 --- a/public/language/ko/admin/settings/uploads.json +++ b/public/language/ko/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "게시물", "allow-files": "사용자가 (이미지가 아닌) 일반 파일을 업로드하는것을 허용", "private": "업로드된 파일들을 개인만 볼 수 있게 바꿉니다.", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "이미지를 특정 가로 길이까지 축소 (단위: 픽셀)", "max-image-width-help": "(단위: 픽셀, 기본값: 760 픽셀, 비활성화를 원하시면 0으로 지정하세요)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ko/email.json b/public/language/ko/email.json index c13dfe3747..eb8bee4035 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -4,6 +4,8 @@ "invite": "%1 님이 초대하였습니다.", "greeting_no_name": "안녕하세요", "greeting_with_name": "안녕하세요 %1님", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "%1님 가입해주셔서 감사합니다.", "welcome.text2": "계정을 활성화하려면 등록하신 메일 주소가 유효한지 확인이 필요합니다.", "welcome.text3": "관리자에 의해 승인되었습니다. 사용자명/비밀번호를 통해 지금 로그인 하실 수 있습니다.", diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index 6b7c393ee2..d39012f0c0 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -28,6 +28,7 @@ "details.grant": "소유권 이전/포기하기", "details.kick": "내보내기", "details.kick_confirm": "이 사용자를 해당 그룹에서 삭제 하시겠습니까?", + "details.add-member": "Add Member", "details.owner_options": "그룹 관리", "details.group_name": "그룹명", "details.member_count": "구성원 수", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index f7367e3e64..873ce6c5e9 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -6,7 +6,10 @@ "popular-month": "인기있는 게시물 (월간)", "popular-alltime": "인기있는 게시물", "recent": "최근 게시물", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "신고된 컨텐츠", "ip-blacklist": "IP 블랙리스트", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 2343eed684..ff2f68393f 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -31,6 +31,8 @@ "following": "팔로잉", "blocks": "차단", "block_toggle": "차단 전환", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "자기소개", "signature": "서명", "birthday": "생일", @@ -107,7 +109,9 @@ "no-sound": "음소거", "upvote-notif-freq": "추천 알림 빈도", "upvote-notif-freq.all": "모든 추천에 알림 사용", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "열 개의 추천마다 알림", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "10, 100, 1000개 마다...", "upvote-notif-freq.disabled": "비활성화", "browsing": "브라우징 설정", diff --git a/public/language/lt/admin/settings/advanced.json b/public/language/lt/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/lt/admin/settings/advanced.json +++ b/public/language/lt/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/lt/admin/settings/uploads.json b/public/language/lt/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/lt/admin/settings/uploads.json +++ b/public/language/lt/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/lt/email.json b/public/language/lt/email.json index fa0f0de0e2..e54708cf6f 100644 --- a/public/language/lt/email.json +++ b/public/language/lt/email.json @@ -4,6 +4,8 @@ "invite": "Pakvietimas nuo %1", "greeting_no_name": "Sveiki", "greeting_with_name": "Sveiki %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Ačiū kad užsiregistravote %1", "welcome.text2": "Kad pilnai aktyvuoti jūsų paskira, mums reikia įsitikinti kad jūs tikrai esate el.pašto valdytojas", "welcome.text3": "Administratorius priemė jūsų prašymą prisijungti prie mūsų. Dabar galite prisijungti su savo slapyvardžiu/slaptažodžiu", diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index f1cf729572..2cf5006329 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -28,6 +28,7 @@ "details.grant": "Duoti/Atšaukti Nuosavybę", "details.kick": "Išmesti", "details.kick_confirm": "Ar tikrai šį narį norite pašalinti iš grupės?", + "details.add-member": "Add Member", "details.owner_options": "Grupės Administratorius", "details.group_name": "Grupės pavadinimas", "details.member_count": "Narių skaičiuotuvas", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 029d375dcc..c9e794aacc 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populiarios temos šį mėnesį", "popular-alltime": "Visų laikų populiarios temos", "recent": "Paskutinės temos", - "top": "Geriausiai įvertintos temos", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderavimo įrankiai", "flagged-content": "Pažymėtas turinys", "ip-blacklist": "IP Juodasis Sąrašas", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 3ea331865b..4b8aada989 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -31,6 +31,8 @@ "following": "Seka", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Apie mane", "signature": "Parašas", "birthday": "Gimimo diena", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Naršymo nustatymai", diff --git a/public/language/ms/admin/settings/advanced.json b/public/language/ms/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/ms/admin/settings/advanced.json +++ b/public/language/ms/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ms/admin/settings/uploads.json b/public/language/ms/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/ms/admin/settings/uploads.json +++ b/public/language/ms/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ms/email.json b/public/language/ms/email.json index e5dffd1dc0..afa3e5e896 100644 --- a/public/language/ms/email.json +++ b/public/language/ms/email.json @@ -4,6 +4,8 @@ "invite": "Jemputan daripada %1", "greeting_no_name": "Salam", "greeting_with_name": "Salam %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Terima kasih kerana mendaftar dengan %1!", "welcome.text2": "Untuk mengaktifkan akaun anda sepenuhnya, kami perlu mengesahkan bahawa anda memiliki alamat emel yang didaftarkan.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index ce56412826..b4d69b1390 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -28,6 +28,7 @@ "details.grant": "Pemberian/Pembatalan pemilikan", "details.kick": "Tendang", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Pentadbiran Kumpulan", "details.group_name": "Nama Kumpulan", "details.member_count": "Kiraan Ahli", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 68eac3d365..fc78aa8fbd 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -6,7 +6,10 @@ "popular-month": "Topik Popular Bulan Ini", "popular-alltime": "Topik Popular Sepanjang Masa", "recent": "Topik Baru", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index e8fca19ebf..71d085250a 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -31,6 +31,8 @@ "following": "Mengikuti", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Tentang saya", "signature": "Tandatangan", "birthday": "Tarikh lahir", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Melihat-lihat Tetapan", diff --git a/public/language/nb/admin/settings/advanced.json b/public/language/nb/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/nb/admin/settings/advanced.json +++ b/public/language/nb/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/nb/admin/settings/uploads.json b/public/language/nb/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/nb/admin/settings/uploads.json +++ b/public/language/nb/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/nb/email.json b/public/language/nb/email.json index 49a9eedfed..ca1f57dc27 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -4,6 +4,8 @@ "invite": "Invitasjon fra %1", "greeting_no_name": "Hei", "greeting_with_name": "Hei, %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Takk for at du registrerte deg hos %1!", "welcome.text2": "For å aktivere kontoen din må vi verifisere at du eier e-postadressen du registrerte deg med.", "welcome.text3": "En administrator har akseptert din søknad om registering. Du kan nå logge inn med ditt brukernavn og passord.", diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 8a0cc6c6de..6d591b8a9c 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -28,6 +28,7 @@ "details.grant": "Gi/Opphev Eierskap", "details.kick": "Kast ut", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Gruppeadministrasjon", "details.group_name": "Gruppenavn", "details.member_count": "Antall medlemmer", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 0a8597820c..772c0f8f88 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populære emner denne måneden", "popular-alltime": "Mest populære emner for all tid", "recent": "Nylige emner", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 8a923762b7..f986e40853 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -31,6 +31,8 @@ "following": "Følger", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Om meg", "signature": "Signatur", "birthday": "Bursdag", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Surfeinnstillinger", diff --git a/public/language/nl/admin/settings/advanced.json b/public/language/nl/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/nl/admin/settings/advanced.json +++ b/public/language/nl/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/nl/admin/settings/uploads.json b/public/language/nl/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/nl/admin/settings/uploads.json +++ b/public/language/nl/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/nl/email.json b/public/language/nl/email.json index 8f9c2faaf0..0b0906255f 100644 --- a/public/language/nl/email.json +++ b/public/language/nl/email.json @@ -4,6 +4,8 @@ "invite": "Uitnodiging van %1 ", "greeting_no_name": "Hallo", "greeting_with_name": "Hallo %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Bedank voor het registreren bij %1!", "welcome.text2": "Om je account volledig te activeren, moet je de instructies uit het bevestigingsbericht opvolgen. Controleer daarom nu eerst je e-mail inbox voor de activeringscode en volg de link in het bericht.", "welcome.text3": "Een administrator heeft uw registratie geaccepteerd. U kan nu inloggen met uw gebruikersnaam en wachtwoord.", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 0cf86d03a7..217abf020d 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -28,6 +28,7 @@ "details.grant": "Toekennen/herroepen van eigendom", "details.kick": "Kick", "details.kick_confirm": "Weet u zeker dat u de gebruiker wilt verwijderen uit de groep?", + "details.add-member": "Add Member", "details.owner_options": "Groepsadministratie", "details.group_name": "Groepsnaam", "details.member_count": "Ledentelling", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index f7aa61e71f..496aa6f2ca 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -6,7 +6,10 @@ "popular-month": "De populaire onderwerpen van deze maand", "popular-alltime": "De populaire onderwerpen", "recent": "Recente onderwerpen", - "top": "Meest gestemde onderwerpen", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator gereedschappen", "flagged-content": "Gemarkeerde content", "ip-blacklist": "IP zwarte lijst", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index a57b909c1e..dbc7a30c53 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -31,6 +31,8 @@ "following": "Volgend", "blocks": "Blokkeringen", "block_toggle": "Toggle Blokkering", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Over mij", "signature": "Handtekening", "birthday": "Verjaardag", @@ -107,7 +109,9 @@ "no-sound": "Geen geluid", "upvote-notif-freq": "Notificatie frequentie voor Upvotes", "upvote-notif-freq.all": "Alle Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Elke tien Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Bij 10, 100, 1000...", "upvote-notif-freq.disabled": "Uitgeschakeld", "browsing": "Instellingen voor bladeren", diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index 945bc06124..f80faeec7e 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Kontrola-Dostępu-Zezwól- Dane Logowania", "headers.acam": "Kontrola-Dostępu-Zezwól-Metody", "headers.acah": "Kontrola-Dostępu-Zezwól-Nagłówki", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Zarządzanie ruchem", "traffic.help": "System NodeBB jest dostarczany z modułem, który automatycznie blokuje żądania w przypadku nadmiernego ruchu. Tutaj możesz zmienić te ustawienia, ale ustawienia początkowe są dobrym punktem wyjścia w większości sytuacji.", "traffic.enable": "Włącz zarządzanie ruchem", diff --git a/public/language/pl/admin/settings/uploads.json b/public/language/pl/admin/settings/uploads.json index 9e76027e2c..eae0dde2e1 100644 --- a/public/language/pl/admin/settings/uploads.json +++ b/public/language/pl/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posty", "allow-files": "Zezwalaj użytkownikom wysyłać pliki", "private": "Oznaczaj wysyłane pliki jako prywatne", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Zmniejszaj obrazy do zadanej szerokości (w pikselach)", "max-image-width-help": "(w pikselach, domyślnie: 760px; ustaw 0, aby wyłączyć)", "resize-image-quality": "Poziom jakości użyty przy zmianie rozmiaru", diff --git a/public/language/pl/email.json b/public/language/pl/email.json index b915282560..6567b5c85b 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -4,6 +4,8 @@ "invite": "Zaproszenie od %1", "greeting_no_name": "Witaj", "greeting_with_name": "Witaj, %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Dziękujemy za rejestrację na %1", "welcome.text2": "Aby w pełni aktywować konto, musisz potwierdzić, że podany adres e-mail należy do Ciebie.", "welcome.text3": "Administrator zaakceptował Twoją prośbę o rejestrację. Możesz się teraz zalogować za pomocą swojej nazwy użytkownika i hasła.", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 9fcc045559..72dae6cd2c 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -28,6 +28,7 @@ "details.grant": "Nadaj/Cofnij prawa Właściciela", "details.kick": "Wykop", "details.kick_confirm": "Jesteś pewny, że chcesz wyrzucić tego użytkownika z grupy?", + "details.add-member": "Add Member", "details.owner_options": "Administracja grupy", "details.group_name": "Nazwa grupy", "details.member_count": "Liczba Członków", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 66b9dae637..6e8156ad94 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -6,7 +6,10 @@ "popular-month": "Tematy popularne w tym miesiącu", "popular-alltime": "Wszystkie popularne tematy", "recent": "Ostatnie tematy", - "top": "Tematy z najwyższą liczbą głosów", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Narzędzia dla moderatorów", "flagged-content": "Flagi", "ip-blacklist": "Czarna lista adresów IP", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 51e5f4384b..1af717fac6 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -31,6 +31,8 @@ "following": "Obserwowani", "blocks": "Blokady", "block_toggle": "Przełącz blokadę", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "O mnie", "signature": "Sygnatura", "birthday": "Urodziny", @@ -107,7 +109,9 @@ "no-sound": "Bez dźwięku", "upvote-notif-freq": "Częstotliwość informowania o pozytywnych głosach", "upvote-notif-freq.all": "Wszystkie głosy", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Co dziesięć głosów", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Po 10, 100, 1000...", "upvote-notif-freq.disabled": "Wyłączone", "browsing": "Ustawienia szukania", diff --git a/public/language/pt-BR/admin/settings/advanced.json b/public/language/pt-BR/admin/settings/advanced.json index 9100724e1d..22f729fb63 100644 --- a/public/language/pt-BR/admin/settings/advanced.json +++ b/public/language/pt-BR/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Administração de Tráfego", "traffic.help": "O NodeBB é instalado equipado com um módulo que automaticamente nega solicitações em situações de alto tráfego. Você pode ajustar estas configurações aqui, apesar de que os padrões são um bom começo.", "traffic.enable": "Ligar a Administração de Tráfego", diff --git a/public/language/pt-BR/admin/settings/uploads.json b/public/language/pt-BR/admin/settings/uploads.json index 82cc8f7b01..b743e55d16 100644 --- a/public/language/pt-BR/admin/settings/uploads.json +++ b/public/language/pt-BR/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Permitir usuários de enviar arquivos comuns", "private": "Tornar arquivos enviados particulares", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Redimensionar imagens até a largura especificada (em pixels)", "max-image-width-help": "(em pixels, padrão: 760 pixels, defina como 0 para desligar)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/pt-BR/email.json b/public/language/pt-BR/email.json index 761f4fa6b1..a29132e787 100644 --- a/public/language/pt-BR/email.json +++ b/public/language/pt-BR/email.json @@ -4,6 +4,8 @@ "invite": "Convite de %1", "greeting_no_name": "Olá", "greeting_with_name": "Olà %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Obrigado por se registrar com %1!", "welcome.text2": "Para terminar de ativar sua conta, nós precisamos verificar que você é o dono do endereço de email com o que você se registrou.", "welcome.text3": "Um administrador aceitou o seu pedido de registro. Você pode fazer login agora com seu nome de usuário/senha.", diff --git a/public/language/pt-BR/groups.json b/public/language/pt-BR/groups.json index 5c411ec37c..45af659913 100644 --- a/public/language/pt-BR/groups.json +++ b/public/language/pt-BR/groups.json @@ -28,6 +28,7 @@ "details.grant": "Conceder/Retomar a Posse", "details.kick": "Chutar", "details.kick_confirm": "Você tem certeza que deseja remover este membro do grupo?", + "details.add-member": "Add Member", "details.owner_options": "Administração do Grupo", "details.group_name": "Nome do Grupo", "details.member_count": "Número de Membros", diff --git a/public/language/pt-BR/pages.json b/public/language/pt-BR/pages.json index e72bb2afbe..3581595bcb 100644 --- a/public/language/pt-BR/pages.json +++ b/public/language/pt-BR/pages.json @@ -6,7 +6,10 @@ "popular-month": "Tópicos populares deste mês", "popular-alltime": "Tópicos populares de todos os tempos", "recent": "Tópicos Recentes", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Ferramentas de Moderação", "flagged-content": "Conteúdo Sinalizado", "ip-blacklist": "Lista negra de IPs", diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 45dd1263be..6fe61b2ee1 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -31,6 +31,8 @@ "following": "Seguindo", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Sobre mim", "signature": "Assinatura", "birthday": "Aniversário", @@ -107,7 +109,9 @@ "no-sound": "Sem som", "upvote-notif-freq": "Frequência de Notificação de Votos Positivos", "upvote-notif-freq.all": "Todos os Votos Positivos", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "A Cada 10 Votos Positivos", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "A cada 10, 100, 1000...", "upvote-notif-freq.disabled": "Desabilitado", "browsing": "Configurações de Navegação", diff --git a/public/language/pt-PT/admin/settings/advanced.json b/public/language/pt-PT/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/pt-PT/admin/settings/advanced.json +++ b/public/language/pt-PT/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/pt-PT/admin/settings/uploads.json b/public/language/pt-PT/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/pt-PT/admin/settings/uploads.json +++ b/public/language/pt-PT/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/pt-PT/email.json b/public/language/pt-PT/email.json index 11d6fe3f57..cc6328e676 100644 --- a/public/language/pt-PT/email.json +++ b/public/language/pt-PT/email.json @@ -4,6 +4,8 @@ "invite": "Convite enviado por %1", "greeting_no_name": "Olá", "greeting_with_name": "Olá %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Obrigado por te teres registado no %1!", "welcome.text2": "De forma a finalizar o processo de activação da tua conta, precisamos de verificar que és o legítimo dono da conta de email registada.", "welcome.text3": "Um administrador aceitou o teu registo de aplicação. Podes agora fazer login com o teu nome de utilizador/palavra-passe.", diff --git a/public/language/pt-PT/groups.json b/public/language/pt-PT/groups.json index d9c9a4439c..55aa3b2dcc 100644 --- a/public/language/pt-PT/groups.json +++ b/public/language/pt-PT/groups.json @@ -28,6 +28,7 @@ "details.grant": "Conceder/rescindir posse", "details.kick": "Expulsar", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Administração do grupo", "details.group_name": "Nome do grupo", "details.member_count": "Contagem de membros", diff --git a/public/language/pt-PT/pages.json b/public/language/pt-PT/pages.json index 51b3ddba04..96f63b3364 100644 --- a/public/language/pt-PT/pages.json +++ b/public/language/pt-PT/pages.json @@ -6,7 +6,10 @@ "popular-month": "Tópicos populares este mês", "popular-alltime": "Tópicos populares desde sempre", "recent": "Tópicos recentes", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "Lista negra de IPs", diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index a52ba76297..5110889608 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -31,6 +31,8 @@ "following": "Seguindo", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Sobre mim", "signature": "Assinatura", "birthday": "Data de nascimento", @@ -107,7 +109,9 @@ "no-sound": "Sem som", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Definições de navegação", diff --git a/public/language/ro/admin/settings/advanced.json b/public/language/ro/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/ro/admin/settings/advanced.json +++ b/public/language/ro/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ro/admin/settings/uploads.json b/public/language/ro/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/ro/admin/settings/uploads.json +++ b/public/language/ro/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ro/email.json b/public/language/ro/email.json index a63923fe06..29b0e0bb6e 100644 --- a/public/language/ro/email.json +++ b/public/language/ro/email.json @@ -4,6 +4,8 @@ "invite": "Invitație de la %1", "greeting_no_name": "Salut", "greeting_with_name": "Salut %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "îți mulțumim că te-ai Înregistrat cu %1!", "welcome.text2": "Pentru a-ți activa cu success contul trebuie să verificăm adresa de email pe care ai folosit-o la înregistrare.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index 96648ce53a..35bac48ea6 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Administrarea grupului", "details.group_name": "Numele grupului", "details.member_count": "Număr de membrii", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 51f4031bb1..1c2d021e41 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -6,7 +6,10 @@ "popular-month": "Subiecte populare în luna asta", "popular-alltime": "All time popular topics", "recent": "Subiecte Noi", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 1d35c22688..1359e33b18 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -31,6 +31,8 @@ "following": "Îi urmărește pe", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Semnătură", "birthday": "Zi de naștere", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Setări navigare", diff --git a/public/language/ru/admin/settings/advanced.json b/public/language/ru/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/ru/admin/settings/advanced.json +++ b/public/language/ru/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ru/admin/settings/uploads.json b/public/language/ru/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/ru/admin/settings/uploads.json +++ b/public/language/ru/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/ru/email.json b/public/language/ru/email.json index 120c922e25..7ff0740f29 100644 --- a/public/language/ru/email.json +++ b/public/language/ru/email.json @@ -4,12 +4,14 @@ "invite": "Приглашение от %1", "greeting_no_name": "Здравствуйте!", "greeting_with_name": "Здравствуйте, %1!", + "email.verify-your-email.subject": "Пожалуйста проверьте свой email", + "email.verify.text1": "Ваш email адрес был изменен!", "welcome.text1": "Благодарим за регистрацию на сайте %1!", "welcome.text2": "Для активации вашей учётной записи необходимо подтвердить адрес электронной почты.", "welcome.text3": "Администратор подтвердил вашу регистрацию. Теперь вы можете авторизоваться на сайте.", "welcome.cta": "Перейдите по ссылке для подтверждения вашей электронной почты", "invitation.text1": "%1 пригласил вас на сайт %2", - "invitation.text2": "Your invitation will expire in %1 days.", + "invitation.text2": "Ваше приглашение завершится в течении %1 дней.", "invitation.ctr": "Нажмите здесь, чтобы создать учётную запись.", "reset.text1": "Кто-то отправил запрос на сброс пароля на нашем сайте. Если вы не подавали запрос, пожалуйста, проигнорируйте это сообщение.", "reset.text2": "Для продолжения процедуры изменения пароля перейдите по ссылке:", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 52853780a0..eba9bd45fb 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -1,24 +1,24 @@ { "invalid-data": "Неверные данные", - "invalid-json": "Invalid JSON", + "invalid-json": "Некорректный JSON", "not-logged-in": "Вы не вошли на сайт.", "account-locked": "Учётная запись временно заблокирована", "search-requires-login": "Поиск доступен только для зарегистрированных участников. Пожалуйста, войдите или зарегистрируйтесь.", - "goback": "Press back to return to the previous page", + "goback": "Нажмите \"назад\", чтобы вернуться на предыдущую страницу", "invalid-cid": "Неверный идентификатор сообщества", "invalid-tid": "Неверный идентификатор темы", "invalid-pid": "Неверный идентификатор сообщения", "invalid-uid": "Неверный идентификатор пользователя", "invalid-username": "Неверное имя пользователя", "invalid-email": "Неверный адрес электронной почты", - "invalid-title": "Invalid title", + "invalid-title": "Некорректный заголовок", "invalid-user-data": "Неверные пользовательские данные", "invalid-password": "Неверный пароль", - "invalid-login-credentials": "Invalid login credentials", + "invalid-login-credentials": "Неверные логин или пароль", "invalid-username-or-password": "Пожалуйста, укажите имя пользователя и пароль", "invalid-search-term": "Неверный поисковой запрос", - "invalid-url": "Invalid URL", - "local-login-disabled": "Local login system has been disabled for non-privileged accounts.", + "invalid-url": "Некорректный URL", + "local-login-disabled": "Локальная система входа отключена для не-привилегированных учетных записей.", "csrf-invalid": "Нам не удалось вас найти из-за просроченной сессии. Попробуйте ещё раз.", "invalid-pagination-value": "Неверно указан номер страницы. Значение должно быть в диапазоне от %1 до %2", "username-taken": "Участник с таким именем пользователя уже зарегистрирован. Пожалуйста, выберите другое имя пользователя.", @@ -35,7 +35,7 @@ "password-too-long": "Пароль слишком длинный", "user-banned": "Участник заблокирован", "user-banned-reason": "Учетная запись заблокирована (Причина: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "Извините, этот аккаунт забанен до %1 (Причина: %2)", "user-too-new": "Вы можете написать своё первое сообщение через %1 сек.", "blacklisted-ip": "Извините, ваш IP адрес был забанен этим сообществом. Если вы считаете, что это ошибка, пожалуйста, свяжитесь с администратором.", "ban-expiry-missing": "Пожалуйста, укажите дату окончания этой блокировки", @@ -83,7 +83,7 @@ "cant-ban-other-admins": "Вы не можете забанить других администраторов", "cant-remove-last-admin": "Вы единственный администратор в этом сообществе. Чтобы отказаться от своих полномочий, пожалуйста, назначьте администратором другого участника.", "cant-delete-admin": "Чтобы удалить эту учётную запись, сначала надо снять с неё полнмочия администратора.", - "invalid-image": "Invalid image", + "invalid-image": "Некорректное изображение", "invalid-image-type": "Этот формат изображения не поддерживается. Загрузите изображение в одном из следующих форматов: %1", "invalid-image-extension": "Недопустимое расширение файла", "invalid-file-type": "Этот формат файла не поддерживается. Загрузите файл в одном из следующих форматов: %1", @@ -111,33 +111,33 @@ "chat-disabled": "Чат выключен", "too-many-messages": "Для отправки нового сообщения необходимо подождать, т.к. вы отправили слишком много сообщений подряд.", "invalid-chat-message": "Ошибка в сообщении", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Сообщения чата не могут быть больше чем %1 символов", "cant-edit-chat-message": "К сожалению, у вас нет доступа для редактирования этого сообщения", "cant-remove-last-user": "Удалить последнего участника невозможно.", "cant-delete-chat-message": "К сожалению, у вас нет доступа для удаления этого сообщения", - "chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting", - "chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting", - "chat-deleted-already": "This chat message has already been deleted.", - "chat-restored'already": "This chat message has already been restored.", + "chat-edit-duration-expired": "Вам разрешено редактировать сообщения чата за %1 секунд после публикации", + "chat-delete-duration-expired": "Вам разрешено удалять сообщения чата за% 1 секунду после публикации", + "chat-deleted-already": "Это сообщение чата уже удалено.", + "chat-restored'already": "Это сообщение чата уже восстановлено.", "already-voting-for-this-post": "Спасибо, вы уже проголосовали за это сообщение.", "reputation-system-disabled": "Система репутации отключена.", "downvoting-disabled": "Понижение оценки отключено", "not-enough-reputation-to-downvote": "У вас недостаточно репутации для понижения оценки сообщения", "not-enough-reputation-to-flag": "У Вас недостаточно репутации, чтобы пометить это сообщение.", - "not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website", - "not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me", - "not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature", - "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture", - "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture", + "not-enough-reputation-min-rep-website": "У вас недостаточно репутации, чтобы добавить сайт", + "not-enough-reputation-min-rep-aboutme": "У вас недостаточно репутации, чтобы добавить \"обо мне\"", + "not-enough-reputation-min-rep-signature": "У вас недостаточно репутации, чтобы добавить подпись", + "not-enough-reputation-min-rep-profile-picture": "У вас недостаточно репутации, чтобы добавить аватарку профиля", + "not-enough-reputation-min-rep-cover-picture": "У вас недостаточно репутации, чтобы добавить обложку профиля", "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", - "sso-multiple-association": "You cannot associate multiple accounts from this service to your NodeBB account. Please dissociate your existing account and try again.", + "sso-registration-disabled": "Регистрация отключена для %1 учетных записей. пожалуйста, сначала зарегистрируйтесь с адресом электронной почты", + "sso-multiple-association": "Вы не можете связать несколько учетных записей из этой службы с учетной записью на данном форуме. Пожалуйста, отмените существующую учетную запись и повторите попытку.", "invite-maximum-met": "Вы пригласили %1 людей из %2 возможных.", "no-session-found": "Сессия входа не найдена!", "not-in-room": "Пользователь отсутствует в этой комнате", @@ -147,9 +147,9 @@ "invalid-home-page-route": "Неверная ссылка на домашнюю страницу", "invalid-session": "Сессия не существует", "invalid-session-text": "Похоже, что ваша сессия больше не активна или она не совпадает с сессией на сервере. Пожалуйста, обновите эту страницу.", - "no-topics-selected": "No topics selected!", - "cant-move-to-same-topic": "Can't move post to same topic!", - "cannot-block-self": "You cannot block yourself!", - "cannot-block-privileged": "You cannot block administrators or global moderators", - "no-connection": "There seems to be a problem with your internet connection" + "no-topics-selected": "Темы не выбраны!", + "cant-move-to-same-topic": "Невозможно переместить посты в эту же тему!", + "cannot-block-self": "Вы не можете заблокировать себя!", + "cannot-block-privileged": "Вы не можете заблокировать администраторов или глобальных модераторов", + "no-connection": "Кажется, что проблема с вашим подключением к Интернету" } \ No newline at end of file diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index dfa8572a9b..8b7c2dcb3e 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -1,65 +1,65 @@ { "state": "Состояние", - "reporter": "Reporter", - "reported-at": "Reported At", + "reporter": "Осведомитель", + "reported-at": "Оповещено", "description": "Описание", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", + "no-flags": "Упс! Меток не найдено", + "assignee": "Представитель", "update": "Обновить", "updated": "Обновлено", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "target-purged": "Содержимое указанной метки было очищено и больше не доступно.", "quick-filters": "Быстрые фильтры", - "filter-active": "There are one or more filters active in this list of flags", + "filter-active": "В этом списке меток есть один или несколько фильтров", "filter-reset": "Убрать фильтры", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", + "filters": "Опции фильтра", + "filter-reporterId": "UID осведомителя", + "filter-targetUid": "Отмечено UID", + "filter-type": "Тип метки", "filter-type-all": "Весь контент", "filter-type-post": "Сообщение", - "filter-type-user": "User", + "filter-type-user": "Пользователь", "filter-state": "Состояние", - "filter-assignee": "Assignee UID", + "filter-assignee": "UID представителя", "filter-cid": "Категория", - "filter-quick-mine": "Assigned to me", + "filter-quick-mine": "Назначено мне", "filter-cid-all": "Все категории", "apply-filters": "Применить фильтры", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", + "quick-links": "Быстрые ссылки", + "flagged-user": "Отмеченный пользователь", "view-profile": "Просмотреть профиль", "start-new-chat": "Начать новый чат", - "go-to-target": "View Flag Target", + "go-to-target": "Посмотреть метку цели", "user-view": "Просмотреть профиль", "user-edit": "Изменить профиль", - "notes": "Flag Notes", + "notes": "Тип заметки", "add-note": "Добавить примечание", - "no-notes": "No shared notes.", + "no-notes": "Нет общих заметок.", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "История меток", + "back": "Вернуться к списку меток", + "no-history": "Нет истории меток.", "state-all": "Все состояния", "state-open": "Новый/Открытый", - "state-wip": "Work in Progress", + "state-wip": "Работа в процессе", "state-resolved": "Решен", "state-rejected": "Отклонен", "no-assignee": "Не назначенный ", - "note-added": "Note Added", + "note-added": "Заметка добавлена", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Сообщить о недопустимом контенте", + "modal-body": "Просьба указать причину для пометки %1 %2 для проверки. Кроме того, используйте одну из кнопок быстрого отчета, если это применимо.", "modal-reason-spam": "Спам", "modal-reason-offensive": "Оскорбительный", "modal-reason-other": "Другое (укажите ниже)", "modal-reason-custom": "Причина жалобы на содержимое...", "modal-submit": "Представить отчет", - "modal-submit-success": "Content has been flagged for moderation.", + "modal-submit-success": "Содержимое было отмечено для модерации.", "modal-submit-confirm": "Подтвердить отправку", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined." + "modal-submit-confirm-text": "Вы уже выбрали причину. Вы уверены, что хотите отправить через быстрый отчет?", + "modal-submit-confirm-text-help": "Отправка быстрого отчета приведет к перезаписи любых предустановленных примеров причин." } \ No newline at end of file diff --git a/public/language/ru/global.json b/public/language/ru/global.json index 5b21463e3d..3ee3c9eb24 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -97,7 +97,7 @@ "enter_page_number": "Введите номер страницы", "upload_file": "Загрузить файл", "upload": "Загрузить", - "uploads": "Uploads", + "uploads": "Загрузки", "allowed-file-types": "Разрешённые форматы файлов %1", "unsaved-changes": "У вас есть несохранённые изменения. Вы уверены, что хотите уйти?", "reconnecting-message": "Похоже, подключение к %1 было разорвано, подождите, пока мы пытаемся восстановить соединение.", @@ -108,5 +108,5 @@ "edited": "Отредактированный", "disabled": "Отключено", "select": "Выбрать", - "user-search-prompt": "Type something here to find users..." + "user-search-prompt": "Введите что-нибудь здесь, чтобы найти пользователей ..." } \ No newline at end of file diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 7f98491798..8051d5e3e4 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -28,6 +28,7 @@ "details.grant": "Выдать/забрать привилегии администратора", "details.kick": "Исключить", "details.kick_confirm": "Вы уверены, что хотите удалить этого участника из группы?", + "details.add-member": "Add Member", "details.owner_options": "Настройки группы", "details.group_name": "Имя группы", "details.member_count": "Количество участников", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index c7b62e9aef..1533b92b15 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -1,5 +1,5 @@ { - "chat.chatting_with": "Chat with", + "chat.chatting_with": "Чат с", "chat.placeholder": "Введите сообщение, нажмите Enter для отправки", "chat.send": "Отправить", "chat.no_active": "У вас нет активных чатов.", @@ -12,7 +12,7 @@ "chat.recent-chats": "Последние переписки", "chat.contacts": "Контакты", "chat.message-history": "История сообщений", - "chat.options": "Chat options", + "chat.options": "Опции чата", "chat.pop-out": "Покинуть диалог", "chat.minimize": "Свернуть", "chat.maximize": "Развернуть", @@ -20,19 +20,19 @@ "chat.thirty_days": "30 дней", "chat.three_months": "3 месяца", "chat.delete_message_confirm": "Вы уверены, что хотите удалить это сообщение?", - "chat.retrieving-users": "Retrieving users...", - "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.retrieving-users": "Получение списка пользователей...", + "chat.manage-room": "Управлять комнатой чата", + "chat.add-user-help": "Поиск пользователей здесь. Когда выбрали пользователя, он будет добавлен в чат. Новый пользователь не сможет видеть сообщения чата, написанные до его добавления в беседу. Только владельцы комнат могут удалить пользователей из чатов.", "chat.confirm-chat-with-dnd-user": "Этот пользователь установил статус \"Не беспокоить\". Вы все еще хотите написать ему?", - "chat.rename-room": "Rename Room", - "chat.rename-placeholder": "Enter your room name here", - "chat.rename-help": "The room name set here will be viewable by all participants in the room.", + "chat.rename-room": "Переименовать комнату", + "chat.rename-placeholder": "Введите название комнаты здесь", + "chat.rename-help": "Название комнаты, установленное здесь, будет доступно для просмотра всеми участниками комнаты.", "chat.leave": "Покинуть Чат", "chat.leave-prompt": "Вы действительно хотите покинуть чат?", - "chat.leave-help": "Leaving this chat will remove you from future correspondence in this chat. If you are re-added in the future, you will not see any chat history from prior to your re-joining.", - "chat.in-room": "In this room", - "chat.kick": "Kick", - "chat.show-ip": "Show IP", + "chat.leave-help": "Оставив этот чат, вы удалите себя из будущей переписки в этом чате. Если вы будете повторно добавлены в будущем, вы не увидите истории чата до вашего повторного присоединения.", + "chat.in-room": "В этой комнате", + "chat.kick": "Исключить", + "chat.show-ip": "Показать IP", "composer.compose": "Редактор сообщений", "composer.show_preview": "Показать предпросмотр сообщения", "composer.hide_preview": "Скрыть предпросмотр", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index f1a6ed7b93..7817273168 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -31,7 +31,7 @@ "user_flagged_post_in_multiple": "Участник %1 и %2 других пометили ваше сообщение %3", "user_flagged_user": "Участник %1 отметили профиль пользователя (%3)", "user_flagged_user_dual": "Участник %1 и %2отметили профиль пользователя (%3)", - "user_flagged_user_multiple": "%1 and %2 others flagged a user profile (%3)", + "user_flagged_user_multiple": "%1 и %2 других отметили профиль пользователя (%3)", "user_posted_to": "Участник %1 ответил на запись: %2", "user_posted_to_dual": "Участники %1 и %2 ответили на вашу запись: %3", "user_posted_to_multiple": "Участник %1 и %2 других ответили на вашу запись: %3", @@ -53,12 +53,12 @@ "notification_and_email": "Уведомление & Электронная почта", "notificationType_upvote": "Когда кто-то проголосовал за ваше сообщение", "notificationType_new-topic": "Отслеживать сообщения в вашей теме", - "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "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_new-register": "Когда кто-то добавляется в очередь регистрации", + "notificationType_post-queue": "Когда новое сообщение помещается в очередь", + "notificationType_new-post-flag": "Когда сообщение помечено", + "notificationType_new-user-flag": "Когда пользователь отмечен" } \ No newline at end of file diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index a9699f7e6f..0eeb2c76db 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -6,7 +6,10 @@ "popular-month": "Популярные темы этого месяца", "popular-alltime": "Популярные темы за всё время", "recent": "Последние темы", - "top": "Самые популярные темы", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Инструменты модератора", "flagged-content": "Выбранное содержимое", "ip-blacklist": "Чёрный список IP", @@ -49,8 +52,8 @@ "account/upvoted": "Рейтинг записей поднят %1", "account/downvoted": "Рейтинг записей снижен %1", "account/best": "Лучшие записи участника %1", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", + "account/blocks": "Заблокировано пользователей по причине %1", + "account/uploads": "Загрузки от %1", "confirm": "Электронная почта подтверждена", "maintenance.text": "Приносим наши извинения, %1 в настоящее время на обслуживании. Пожалуйста, приходите позже.", "maintenance.messageIntro": "Администратор оставил сообщение:", diff --git a/public/language/ru/register.json b/public/language/ru/register.json index a2cb53e057..1d92f454f8 100644 --- a/public/language/ru/register.json +++ b/public/language/ru/register.json @@ -20,7 +20,7 @@ "registration-added-to-queue": "Ваша регистрация была добавлена в очередь на утверждение. Вы получите уведомление по электронной почте, когда она будет одобрена администратором.", "interstitial.intro": "Нам потребуется дополнительная информация, прежде чем мы сможем создать вашу учётную запись.", "interstitial.errors-found": "Мы не смогли завершить регистрацию:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "Я соглашаюсь на сбор и обработку моей личной информации на этом веб-сайте.", + "gdpr_agree_email": "Я соглашаюсь получать дайджесты и уведомления на свой email с этого сайта.", + "gdpr_consent_denied": "Вы должны дать согласие на сбор, обработку вашей информации и отправку вам электронных сообщений на email." } \ No newline at end of file diff --git a/public/language/ru/reset_password.json b/public/language/ru/reset_password.json index 241b50fa8f..db280566ed 100644 --- a/public/language/ru/reset_password.json +++ b/public/language/ru/reset_password.json @@ -9,7 +9,7 @@ "repeat_password": "Подтвердите пароль", "enter_email": "Пожалуйста введите ваш адрес электронной почты, чтобы получить письмо с инструкцией по восстановлению пароля.", "enter_email_address": "Введите адрес электронной почты", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "password_reset_sent": "На указанный адрес отправлено электронное письмо с сбросом пароля. Обратите внимание, что за минуту отправляется только одно электронное письмо.", "invalid_email": "Адрес электронной почты указан неверно. Пожалуйста, исправьте", "password_too_short": "Введённый пароль слишком короткий, это небезопасно. Пожалуйста, придумайте более длинный пароль.", "passwords_do_not_match": "Введённые пароли не совпадают. Пожалуйста, укажите одинаковые пароли.", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index 3c2d5ec9b8..1b834b80cd 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -5,7 +5,7 @@ "in": "В", "titles": "Названия", "titles-posts": "Названия и записи", - "match-words": "Match words", + "match-words": "Совпадающие слова", "all": "Все", "any": "Любые", "posted-by": "В именах авторов записей", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 4986cf4688..55cbe710d5 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -31,11 +31,11 @@ "pinned": "Прикреплена", "moved": "Перемещена", "copy-ip": "Копировать IP", - "ban-ip": "Ban IP", + "ban-ip": "Забанить IP", "view-history": "Редактировать историю", "bookmark_instructions": "Нажмите здесь, чтобы вернуться к последнему прочитанному сообщению в этой теме.", "flag_title": "Отметить сообщение для модерирования", - "merged_message": "This topic has been merged into %2", + "merged_message": "Эта тема была объединена с %2", "deleted_message": "Эта тема была удалена. Только пользователи с правами управления темами могут ее видеть.", "following_topic.message": "Теперь вы будете получать уведомления при обновлении этой темы.", "not_following_topic.message": "Вы увидите эту тему в списке непрочитанных тем, но Вы не будете получать уведомления, когда кто-то напишет сообщение в эту тему.", @@ -62,7 +62,7 @@ "thread_tools.lock": "Закрыть тему", "thread_tools.unlock": "Открыть тему", "thread_tools.move": "Переместить тему", - "thread_tools.move-posts": "Move Posts", + "thread_tools.move-posts": "Переместить пост", "thread_tools.move_all": "Переместить всё", "thread_tools.select_category": "Выберите категорию", "thread_tools.fork": "Создать дополнительную ветвь дискуссии", @@ -97,7 +97,7 @@ "fork_success": "Готово! Просмотр отделённой темы.", "delete_posts_instruction": "Отметьте записи, которые вы хотите удалить", "merge_topics_instruction": "Выберите темы которые вы хотите объединить", - "move_posts_instruction": "Click the posts you want to move", + "move_posts_instruction": "Нажмите на сообщения, которые вы хотите переместить", "composer.title_placeholder": "Введите название темы...", "composer.handle_placeholder": "Название", "composer.discard": "Отменить", @@ -118,16 +118,16 @@ "sort_by": "Сортировка", "oldest_to_newest": "Начиная со старых записей", "newest_to_oldest": "Начиная с новых записей", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "Количество голосов", + "most_posts": "Количество сообщений", "stale.title": "Создать новую тему вместо этой?", "stale.warning": "Тема, в которую вы пишите, очень старая. Вы хотите создать новую тему?", "stale.create": "Создать новую тему", "stale.reply_anyway": "Всё равно ответить в этой теме", "link_back": "Ответ: [%1](%2)", "diffs.title": "История Редактирования Сообщения", - "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", - "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.description": "У этого поста есть %1 изменений. Нажмите один из приведенных ниже изменений, чтобы просмотреть содержимое сообщения в тот момент.", + "diffs.no-revisions-description": "У этого поста %1изменений", + "diffs.current-revision": "текущая ревизия", + "diffs.original-revision": "оригинальная ревизия" } \ No newline at end of file diff --git a/public/language/ru/uploads.json b/public/language/ru/uploads.json index 9b0fe57f20..fbc28a6775 100644 --- a/public/language/ru/uploads.json +++ b/public/language/ru/uploads.json @@ -3,7 +3,7 @@ "select-file-to-upload": "Укажите файл для загрузки!", "upload-success": "Файл успешно загружен!", "maximum-file-size": "Максимум %1 kb", - "no-uploads-found": "No uploads found", - "public-uploads-info": "Uploads are public, all visitors can see them.", - "private-uploads-info": "Uploads are private, only logged in users can see them." + "no-uploads-found": "Загрузки не найдены", + "public-uploads-info": "Загрузки общедоступны, все посетители могут их видеть.", + "private-uploads-info": "Загрузки являются частными, только зарегистрированные пользователи могут их видеть." } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 8c89033988..0a92f4cc46 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -31,6 +31,8 @@ "following": "Подписок", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Обо мне", "signature": "Подпись", "birthday": "День рождения", @@ -107,7 +109,9 @@ "no-sound": "Без звука", "upvote-notif-freq": "Частота уведомлений о понравившемся отзыве", "upvote-notif-freq.all": "Все положительные отзывы", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Каждые десять понравившихся отзывов", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", "upvote-notif-freq.disabled": "Выключено", "browsing": "Настройки просмотра", @@ -151,19 +155,19 @@ "consent.intro": "Мы используем эту информацию исключительно для персонализации вашего опыта в этом сообществе, а также для связывания сообщений, которые вы вносите в свою учетную запись пользователя. Во время этапа регистрации вас попросили указать имя пользователя и адрес электронной почты, вы также можете предоставить дополнительную информацию, чтобы заполнить свой профиль пользователя на этом веб-сайте.

Мы сохраняем эту информацию на все время существования учетной записи пользователя, и вы можете отозвать согласие в любое время, удалив свою учетную запись. В любое время вы можете запросить копию своего вклада на этот веб-сайт, используя раздел \"ваши права и согласие\"

Если у вас есть какие-либо вопросы или опасения, мы рекомендуем вам обратиться к администрации этого форума.", "consent.email_intro": "Иногда мы можем отправлять электронные письма на ваш зарегистрированный адрес электронной почты, чтобы предоставлять обновления и / или уведомлять вас о новой деятельности, которая вам подходит. Вы можете настроить частоту дайджестов сообщества (в том числе отключить его напрямую), а также выбрать, какие типы уведомлений получать по электронной почте, на странице настроек пользователя.", "consent.digest_frequency": "Если в пользовательских настройках ничего не изменено, это сообщество отправляет электронные дайджесты каждые %1.", - "consent.digest_off": "Если в пользовательских настройках ничего не изменено, это сообщество не отправляет электронные дайджесты", - "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", - "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", - "consent.give": "Give consent", - "consent.right_of_access": "You have the Right of Access", - "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", - "consent.right_to_rectification": "You have the Right to Rectification", - "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", - "consent.right_to_erasure": "You have the Right to Erasure", - "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", - "consent.export_profile": "Export Profile (.csv)", - "consent.export_uploads": "Export Uploaded Content (.zip)", - "consent.export_posts": "Export Posts (.csv)" + "consent.digest_off": "Если в пользовательских настройках ничего не изменено, это сообщество не будет отправлять электронные дайджесты", + "consent.received": "Вы дали согласие на этот сайт для сбора и обработки вашей информации. Никаких дополнительных действий не требуется.", + "consent.not_received": "Вы не дали согласия на сбор и обработку данных. В любое время администрация этого веб-сайта может удалить вашу учетную запись, чтобы она соответствовала Общему правилу защиты данных (GDPR).", + "consent.give": "Дать согласие", + "consent.right_of_access": "У вас есть права доступа", + "consent.right_of_access_description": "Вы имеете право на доступ к любым данным, собранным на этом веб-сайте по запросу. Вы можете получить копию этих данных, нажав соответствующую кнопку ниже.", + "consent.right_to_rectification": "У вас есть право на исправление", + "consent.right_to_rectification_description": "Вы имеете право изменять или обновлять любые неточные данные, предоставленные нам. Ваш профиль можно обновить, отредактировав свой профиль, а опубликованный контент всегда можно редактировать. Если это не так, обратитесь в административную группу этого сайта.", + "consent.right_to_erasure": "У вас есть право на удаление", + "consent.right_to_erasure_description": "В любое время вы можете отозвать свое согласие на сбор и / или обработку данных, удалив свою учетную запись. Ваш индивидуальный профиль можно удалить, хотя ваше размещенное содержимое останется. Если вы хотите удалить как свою учетную запись, так и и свой контент, пожалуйста, свяжитесь с администрацией этого веб-сайта.", + "consent.right_to_data_portability": "У вас есть право на перенос данных", + "consent.right_to_data_portability_description": "Вы можете запросить у нас машиночитаемый экспорт любых собранных данных о вас и вашей учетной записи. Вы можете сделать это, нажав соответствующую кнопку ниже.", + "consent.export_profile": "Экспорт профиля (.csv)", + "consent.export_uploads": "Экспорт загруженного контента (.zip)", + "consent.export_posts": "Экспорт постов (.csv)" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/advanced.json b/public/language/rw/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/rw/admin/settings/advanced.json +++ b/public/language/rw/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/rw/admin/settings/uploads.json b/public/language/rw/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/rw/admin/settings/uploads.json +++ b/public/language/rw/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/rw/email.json b/public/language/rw/email.json index 0c3e206bd7..e136059442 100644 --- a/public/language/rw/email.json +++ b/public/language/rw/email.json @@ -4,6 +4,8 @@ "invite": "Ubutumire buvuye kuri %1", "greeting_no_name": "Mwirwe", "greeting_with_name": "Mwiriwe %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Urakoze kwiyandika nk'ukoresha %1!", "welcome.text2": "Kugirango tuguhe uburenganzira busesuye bwo gukoresha konte yawe, tugomba kubanza gusuzuma niba email watanze wiyandikisha ari iyawe. ", "welcome.text3": "Umuyobozi w'urubuga yemeye ubusabe bwawe bwo kwandikwa nk'ukoresha urubuga. Ushobora noneho kwinjiramo ukoresheje izina n'ijambobanga byawe.", diff --git a/public/language/rw/groups.json b/public/language/rw/groups.json index 46ee5fd648..f185c6edfc 100644 --- a/public/language/rw/groups.json +++ b/public/language/rw/groups.json @@ -28,6 +28,7 @@ "details.grant": "Tanga/Ambura Ubuyobozi", "details.kick": "Tera", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Ubuyobozi bw'Itsinda", "details.group_name": "Izina ry'Itsinda", "details.member_count": "Umubare w'Abagize Itsinda", diff --git a/public/language/rw/pages.json b/public/language/rw/pages.json index c5f80d16af..9ccc587f4e 100644 --- a/public/language/rw/pages.json +++ b/public/language/rw/pages.json @@ -6,7 +6,10 @@ "popular-month": "Ibiganiro bikunzwe uku kwezi", "popular-alltime": "Ibiganiro byakunzwe ibihe byose", "recent": "Ibiganiro Biheruka", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/rw/user.json b/public/language/rw/user.json index b68331cc2b..e1ce6a9082 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -31,6 +31,8 @@ "following": "Akurikira", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Inshamake y'Ubuzima", "signature": "Intero", "birthday": "Itariki y'Amavuko", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Gutunganya Uburyo Usoma", diff --git a/public/language/sc/admin/settings/advanced.json b/public/language/sc/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/sc/admin/settings/advanced.json +++ b/public/language/sc/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sc/admin/settings/uploads.json b/public/language/sc/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/sc/admin/settings/uploads.json +++ b/public/language/sc/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/sc/email.json b/public/language/sc/email.json index 5172a0ecb6..b639351dff 100644 --- a/public/language/sc/email.json +++ b/public/language/sc/email.json @@ -4,6 +4,8 @@ "invite": "Invitation from %1", "greeting_no_name": "Hello", "greeting_with_name": "Hello %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Thank you for registering with %1!", "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index 9b6fd4b241..c4584e9270 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Group Administration", "details.group_name": "Group Name", "details.member_count": "Member Count", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index cbc86cce3a..3054286b66 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -6,7 +6,10 @@ "popular-month": "Popular topics this month", "popular-alltime": "All time popular topics", "recent": "Ùrtimas Arresonadas", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index c1605a8846..af5fd14050 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -31,6 +31,8 @@ "following": "Sighende", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "About me", "signature": "Firma", "birthday": "Cumpleannu", @@ -107,7 +109,9 @@ "no-sound": "No sound", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", diff --git a/public/language/sk/admin/settings/advanced.json b/public/language/sk/admin/settings/advanced.json index b3678dd04a..4f4e8859e1 100644 --- a/public/language/sk/admin/settings/advanced.json +++ b/public/language/sk/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Správa prevádzky", "traffic.help": "NodeBB obsahuje modul, ktorý automaticky zamieta požiadavky pri vysokom vyťažení. Toto nastavenie môžete upraviť tu, hoci východiskové hodnoty sú zaručením úspechu.", "traffic.enable": "Povoliť správu prevádzky", diff --git a/public/language/sk/admin/settings/uploads.json b/public/language/sk/admin/settings/uploads.json index 6da66e67e0..bf7a2c7a33 100644 --- a/public/language/sk/admin/settings/uploads.json +++ b/public/language/sk/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Príspevky", "allow-files": "Umožniť používateľom nahrávať bežné súbory", "private": "Nahrané súbory sú súkromné", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Zmenšiť veľkosť obrázkov na potrebné rozlíšenie (v pixeloch)", "max-image-width-help": "(v pixeloch, predvolené: 760 pixelov, pre zákaz nastavte 0)", "resize-image-quality": "Kvalita pri zmene veľkosti obrázkov", diff --git a/public/language/sk/email.json b/public/language/sk/email.json index 76ad0ccebd..3478cb08b0 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -4,6 +4,8 @@ "invite": "Pozvánka od %1", "greeting_no_name": "Dobrý deň", "greeting_with_name": "Dobrý deň %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Ďakujeme Vám za registráciu s %1!", "welcome.text2": "Pre úplne aktivovanie Vášho účtu, musíme overiť e-mailovú adresu, ktorú ste zadali pri registrácií.", "welcome.text3": "Správca práve potvrdil vašu registráciu. Teraz sa môžete prihlásiť svojím menom a heslom.", diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index d6e74ba5ac..ef05d9e9d6 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -28,6 +28,7 @@ "details.grant": "Pridať/Zrušiť vlastníctvo", "details.kick": "Vyhodiť", "details.kick_confirm": "Ste si naozaj istý, že chcete odstrániť tohto člena zo skupiny?", + "details.add-member": "Add Member", "details.owner_options": "Správca skupiny", "details.group_name": "Názov skupiny", "details.member_count": "Počet členov", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index 6e272314a2..f5ff228f24 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populárne témy za tento mesiac", "popular-alltime": "Populárne témy za celé obdobie", "recent": "Nedávne témy", - "top": "Témy s najviac hlasmi", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Nástroje moderátora", "flagged-content": "Nahlásený obsah", "ip-blacklist": "Čierny zoznam IP adries", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 883b312695..720c6959c6 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -31,6 +31,8 @@ "following": "Nasleduje", "blocks": "Zablokovaný", "block_toggle": "Prepnúť zablokovanie", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "O mne", "signature": "Podpis", "birthday": "Dátum narodenia", @@ -107,7 +109,9 @@ "no-sound": "Žiadny zvuk", "upvote-notif-freq": "Frekvencia upozornení na súhlasy", "upvote-notif-freq.all": "Všetky súhlasy", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Každý desiaty súhlas", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Podľa 10, 100, 1000...", "upvote-notif-freq.disabled": "Zakázané", "browsing": "Nastavenia prehľadávania", diff --git a/public/language/sl/admin/settings/advanced.json b/public/language/sl/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/sl/admin/settings/advanced.json +++ b/public/language/sl/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sl/admin/settings/uploads.json b/public/language/sl/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/sl/admin/settings/uploads.json +++ b/public/language/sl/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/sl/email.json b/public/language/sl/email.json index 3c835431d6..00ef779e6a 100644 --- a/public/language/sl/email.json +++ b/public/language/sl/email.json @@ -4,6 +4,8 @@ "invite": "Povabilo uporabnika %1", "greeting_no_name": "Pozdravljeni!", "greeting_with_name": "Pozdravljeni, %1!", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Hvala, da ste se registrirali na forumu %1!", "welcome.text2": "Pred aktiviranjem vašega računa moramo preveriti lastništvo elektronskega naslova, s katerim ste se registrirali.", "welcome.text3": "Skrbnik je sprejel vašo registracijo. Sedaj se lahko prijavite s svojim uporabniškim imenom in geslom.", diff --git a/public/language/sl/groups.json b/public/language/sl/groups.json index fb6a593613..4b9944f41d 100644 --- a/public/language/sl/groups.json +++ b/public/language/sl/groups.json @@ -28,6 +28,7 @@ "details.grant": "Dodeli/Prekliči lastništvo", "details.kick": "Odstrani iz skupine", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Administratorji skupine", "details.group_name": "Ime skupine", "details.member_count": "Število članov", diff --git a/public/language/sl/pages.json b/public/language/sl/pages.json index 4bc485f5cf..95e1b5645e 100644 --- a/public/language/sl/pages.json +++ b/public/language/sl/pages.json @@ -6,7 +6,10 @@ "popular-month": "Priljubljene teme v tem mesecu", "popular-alltime": "Vse priljubljene teme", "recent": "Zadnje teme", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 86b5468e03..316e3d8a87 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -31,6 +31,8 @@ "following": "Spremljano", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "O meni", "signature": "Podpis", "birthday": "Rojstni datum", @@ -107,7 +109,9 @@ "no-sound": "Ni zvoka", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Preglej nastavitve", diff --git a/public/language/sr/admin/settings/advanced.json b/public/language/sr/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/sr/admin/settings/advanced.json +++ b/public/language/sr/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sr/admin/settings/uploads.json b/public/language/sr/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/sr/admin/settings/uploads.json +++ b/public/language/sr/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/sr/email.json b/public/language/sr/email.json index 693d1f556b..cd1c7dfda1 100644 --- a/public/language/sr/email.json +++ b/public/language/sr/email.json @@ -4,6 +4,8 @@ "invite": "Позивница од %1", "greeting_no_name": "Здраво", "greeting_with_name": "Здраво %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Хвала што сте се регистровали на %1!", "welcome.text2": "Да бисте у потпуности активирали ваш налог, потребно је да проверимо да ли стварно поседујете адресу е-поште којом сте се регистровали. ", "welcome.text3": "Администратор је прихватио вашу регистрацију. Можете се пријавити са вашим именом и лозинком.", diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json index 2140e845dd..6513e60c65 100644 --- a/public/language/sr/groups.json +++ b/public/language/sr/groups.json @@ -28,6 +28,7 @@ "details.grant": "Одобри/Поништи власништво", "details.kick": "Избаци", "details.kick_confirm": "Да ли сте сигурни да желите да уклоните овог члана из групе?", + "details.add-member": "Add Member", "details.owner_options": "Администрација групе", "details.group_name": "Име групе", "details.member_count": "Број чланова", diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index 820e9bba11..a4840b4e20 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -6,7 +6,10 @@ "popular-month": "Популарне теме овог месеца", "popular-alltime": "Популарне теме свих времена", "recent": "Недавне теме", - "top": "Најгласаније теме", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Алати модератора", "flagged-content": "Садржај означен заставицом", "ip-blacklist": "Црна листа IP адреса", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 467af20b52..c4ebd2bb37 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -31,6 +31,8 @@ "following": "Праћења", "blocks": "Блокирања", "block_toggle": "Блокирај/одблокирај", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "О мени", "signature": "Потпис", "birthday": "Рођендан", @@ -107,7 +109,9 @@ "no-sound": "Без звука", "upvote-notif-freq": "Учесталост обавештења о гласовима", "upvote-notif-freq.all": "На сваки глас", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "На сваких десет гласова", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", "upvote-notif-freq.disabled": "Онемогућено", "browsing": "Подешавање прегледања", diff --git a/public/language/sv/admin/settings/advanced.json b/public/language/sv/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/sv/admin/settings/advanced.json +++ b/public/language/sv/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sv/admin/settings/uploads.json b/public/language/sv/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/sv/admin/settings/uploads.json +++ b/public/language/sv/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/sv/email.json b/public/language/sv/email.json index 926fe3b930..1d6cc904d7 100644 --- a/public/language/sv/email.json +++ b/public/language/sv/email.json @@ -4,6 +4,8 @@ "invite": "Inbjudan ifrån %1", "greeting_no_name": "Hej", "greeting_with_name": "Hej %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Tack för att du registerar dig på %1!", "welcome.text2": "För att slutföra aktiveringen av ditt konto, behöver vi verifiera att du har tillgång till den e-postadress du registrerade dig med.", "welcome.text3": "En administrator har accepterat din registreringsansökan. Du kan logga in med ditt användarnamn och lösenord nu.", diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index f5cec12bf5..4f1a0c4261 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -28,6 +28,7 @@ "details.grant": "Tilldela/Dra tillbaka ägarskap", "details.kick": "Sparka ut", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "Gruppadministration", "details.group_name": "Gruppnamn", "details.member_count": "Medlemsantal", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index a6f1fdf602..2ff8e81d4c 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -6,7 +6,10 @@ "popular-month": "Populära ämnen denna månad", "popular-alltime": "Populäraste ämnena genom tiderna", "recent": "Senaste ämnena", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Svartlista", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index a2c37bcddb..aa30b37c66 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -31,6 +31,8 @@ "following": "Följer", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Om mig", "signature": "Signatur", "birthday": "Födelsedag", @@ -107,7 +109,9 @@ "no-sound": "Inget ljud", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "Inställning för bläddring", diff --git a/public/language/th/admin/settings/advanced.json b/public/language/th/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/th/admin/settings/advanced.json +++ b/public/language/th/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/th/admin/settings/uploads.json b/public/language/th/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/th/admin/settings/uploads.json +++ b/public/language/th/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/th/email.json b/public/language/th/email.json index a43b88e543..3f0bc0f577 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -4,6 +4,8 @@ "invite": "คำเชิญจาก %1", "greeting_no_name": "สวัสดี", "greeting_with_name": "สวัสดี %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "ขอบคุณที่ลงทะเบียนกับ %1", "welcome.text2": "เพื่อให้การบัญชีของคุณใช้งานได้อย่างเสร็จสมบูรณ์ เราจำเป็นต้องยืนยันว่าคุณเป็นเจ้าของที่แท้จริงของอีเมล์ที่ใช้สมัครสมาชิก", "welcome.text3": "ผู้ดูแลระบบได้ทำการยอมรับการสมัครสมาชิกของคุณแล้ว คุณสามารถเข้าสู่ระบบด้วย ชื่อผู้ใช้/รหัสผ่าน ได้แล้วตอนนี้", diff --git a/public/language/th/groups.json b/public/language/th/groups.json index 1e1f235f9c..5fc82ce200 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -28,6 +28,7 @@ "details.grant": "ให้ / ยกเลิกการเป็นเจ้าของ", "details.kick": "เตะออก", "details.kick_confirm": "คุณแน่ใจใช่ไหมว่าต้องการลบสมาชิกคนนี้ออกจากกลุ่ม?", + "details.add-member": "Add Member", "details.owner_options": "การจัดการกลุ่ม", "details.group_name": "ชื่อกลุ่ม", "details.member_count": "จำนวนสมาชิก", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index c1e89da718..46806bbba6 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -6,7 +6,10 @@ "popular-month": "กระทู้ฮิตเดือนนี้", "popular-alltime": "กระทู้ฮิตตลาดกาล", "recent": "กระทู้ล่าสุด", - "top": "กระทู้โหวตสูงสุด", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "เครื่องมือผู้ดูแลระบบ", "flagged-content": "เนื้อหาที่ถูกปักธง", "ip-blacklist": "ไอดีที่ถูกขึ้นบัญชีดำ", diff --git a/public/language/th/user.json b/public/language/th/user.json index 3ed1562ad6..c59c17b2af 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -31,6 +31,8 @@ "following": "ติดตาม", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "เกี่ยวกับฉัน", "signature": "ลายเซ็น", "birthday": "วันเกิด", @@ -107,7 +109,9 @@ "no-sound": "ไม่มีเสียง", "upvote-notif-freq": "แจ้งเตือนความถี่โหวตขึ้น", "upvote-notif-freq.all": "โหวตขึ้นทั้งหมด", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "ทุกๆ 10 โหวตขึ้น", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "ทุกๆ 10, 100, 1000...", "upvote-notif-freq.disabled": "ปิด", "browsing": "เปิดดูการตั้งค่า", diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index 6d15d1a93c..d247a1e710 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Erişim-Kontrolü-KimlikBilgileri-İzni", "headers.acam": "Erişim-Kontrolü-Yöntem-İzni", "headers.acah": "Erişim-Kontrolü-Başlık-İzni", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Trafik Yönetimi", "traffic.help": "NodeBB, yoğun trafik isteklerini otomatik olarak reddeden bir modül ile donatılmıştır. Varsayıla ayarlar başlangıç için yeterli olsa da, bu ayarları buradan düzenleyebilirsiniz.", "traffic.enable": "Trafik Yönetimini Etkinleştir", diff --git a/public/language/tr/admin/settings/uploads.json b/public/language/tr/admin/settings/uploads.json index 2bdbe5f7cb..4ff7dd7b9b 100644 --- a/public/language/tr/admin/settings/uploads.json +++ b/public/language/tr/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "İletiler", "allow-files": "Kullanıcıların normal dosyalar yüklemesine izin ver", "private": "Yüklenen dosyaları gizli yap", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Görüntüleri belirtilen genişliğe (piksel cinsinden) yeniden boyutlandır", "max-image-width-help": "(Piksel, varsayılan: 128 piksel, devre dışı bırakmak için 0'a ayarlayın)", "resize-image-quality": "Resimleri yeniden boyutlandırırken kullanılacak kalite", diff --git a/public/language/tr/email.json b/public/language/tr/email.json index 85f4350243..aac994ca6f 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -4,6 +4,8 @@ "invite": "%1 sizi davet etti", "greeting_no_name": "Merhaba", "greeting_with_name": "Merhaba %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Kaydolduğunuz için teşekkürler!", "welcome.text2": "Hesabınızı aktif hale getirmek için, kaydolduğunuz e-posta adresinin size ait olduğunu onaylamamız gerekiyor.", "welcome.text3": "Yönetici kayıt olma isteğinizi kabul etti. Kullanıcı adı/şifre ile giriş yapabilirsiniz.", diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index e09205c7c3..c31b39b418 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -28,6 +28,7 @@ "details.grant": "Grup Sahibi Yap/Kaldır", "details.kick": "Dışarı at", "details.kick_confirm": "Bu üyeyi bu gruptan silmek istediğinden emin misin?", + "details.add-member": "Add Member", "details.owner_options": "Grup Yöneticisi", "details.group_name": "Grup ismi", "details.member_count": "Üye Sayısı", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 45a87556ca..c503fae900 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -6,7 +6,10 @@ "popular-month": "Bu ayki popüler başlıklar", "popular-alltime": "En popüler başlıklar", "recent": "Güncel Konular", - "top": "En Çok Oylanan Başlıklar", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderatör Araçları", "flagged-content": "Bayraklanan İçerik", "ip-blacklist": "IP Kara Listesi", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index e999014f2b..6dd18cba2c 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -31,6 +31,8 @@ "following": "Takip Ediyor", "blocks": "Blok", "block_toggle": "Blokta Geçiş Yap", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Hakkımda", "signature": "İmza", "birthday": "Doğum Tarihi", @@ -107,7 +109,9 @@ "no-sound": "Ses yok", "upvote-notif-freq": "Artı Oy Bildiri Sıklığı", "upvote-notif-freq.all": "Büyün Artı Oylar", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Her Artı On Oy", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "10, 100, 1000...", "upvote-notif-freq.disabled": "Devre dışı", "browsing": "Tarayıcı Ayaları", diff --git a/public/language/uk/admin/settings/advanced.json b/public/language/uk/admin/settings/advanced.json index 2611348814..617b95dc78 100644 --- a/public/language/uk/admin/settings/advanced.json +++ b/public/language/uk/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Доступ-Контроль-Дозвіл-Права", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Керування трафіком", "traffic.help": "NodeBB має модуль автоматичного відхилення запитів у разі надмірного напливу користувачів. Ви можете налаштувати цей модуль тут, хоча типові налаштування є достатньо дієвими.", "traffic.enable": "Увімкнути керування трафіком", diff --git a/public/language/uk/admin/settings/uploads.json b/public/language/uk/admin/settings/uploads.json index 5bdb1d39fa..8197253929 100644 --- a/public/language/uk/admin/settings/uploads.json +++ b/public/language/uk/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Пости", "allow-files": "Дозволити користувачам завантажувати звичайні файли", "private": "Зробити завантажувані файли приватними", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "Змінювати розмір зображень до заданої ширини (в пікселях)", "max-image-width-help": "(в пікселях, 760 — за замовчуванням, 0 — вимкнути)", "resize-image-quality": "Якість зображення при зміні розміру", diff --git a/public/language/uk/email.json b/public/language/uk/email.json index 4a0d6387d6..767a442c51 100644 --- a/public/language/uk/email.json +++ b/public/language/uk/email.json @@ -4,6 +4,8 @@ "invite": "Запрошення від %1", "greeting_no_name": "Привіт", "greeting_with_name": "Привіт %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Дякуємо за реєстрацію з %1!", "welcome.text2": "Щоб повністю активувати ваш акаунт, нам потрібно перевірити, що вам належить електронна адреса, яку ви вказали при реєстрації ", "welcome.text3": "Адміністратор схвалив ваш запит на реєстрацію. Ви можете залогінитись, використовуючи свій пароль та назву акаунту", diff --git a/public/language/uk/groups.json b/public/language/uk/groups.json index 5115079c01..09f936fcba 100644 --- a/public/language/uk/groups.json +++ b/public/language/uk/groups.json @@ -28,6 +28,7 @@ "details.grant": "Надати/забрати права адміністратора", "details.kick": "Вигнати", "details.kick_confirm": "Ви впевнені, що бажаєте видалити цього користувача з групи?", + "details.add-member": "Add Member", "details.owner_options": "Адміністрація групи", "details.group_name": "Назва групи", "details.member_count": "Кількість учасників", diff --git a/public/language/uk/pages.json b/public/language/uk/pages.json index 7ea6e9446b..42a1c5268e 100644 --- a/public/language/uk/pages.json +++ b/public/language/uk/pages.json @@ -6,7 +6,10 @@ "popular-month": "Популярні теми цього місяця", "popular-alltime": "Популярні теми за весь час", "recent": "Свіжі теми", - "top": "Найпопулярніші теми", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Інструменти Модератора", "flagged-content": "Оскаржений вміст", "ip-blacklist": "Чорний список IP адрес", diff --git a/public/language/uk/user.json b/public/language/uk/user.json index 95900a92ff..da9f1266e3 100644 --- a/public/language/uk/user.json +++ b/public/language/uk/user.json @@ -31,6 +31,8 @@ "following": "Відстежувані", "blocks": "Блокування", "block_toggle": "Увімкнути Блокування", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Про мене", "signature": "Підпис", "birthday": "День народження", @@ -107,7 +109,9 @@ "no-sound": "Без звуку", "upvote-notif-freq": "Частота сповіщень позитивних відгуків", "upvote-notif-freq.all": "Всі позитивні відгуки", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Кожні 10 позитивних відгуків", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", "upvote-notif-freq.disabled": "Вимкнено", "browsing": "Налаштування перегляду", diff --git a/public/language/vi/admin/settings/advanced.json b/public/language/vi/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/vi/admin/settings/advanced.json +++ b/public/language/vi/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/vi/admin/settings/uploads.json b/public/language/vi/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/vi/admin/settings/uploads.json +++ b/public/language/vi/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/vi/email.json b/public/language/vi/email.json index 3ea56af35e..33b7b1544b 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -4,6 +4,8 @@ "invite": "Lời mời từ %1", "greeting_no_name": "Xin chào", "greeting_with_name": "Xin chào %1", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "Cảm ơn bạn đã đăng ký tại %1!", "welcome.text2": "Để kích hoạt đầy đủ tính năng của tài khoản, chúng tôi cần xác nhận bạn là chủ của địa chỉ email mà bạn đã đăng ký.", "welcome.text3": "Quản trị viên đã chấp nhận đơn đăng ký của bạn. Bạn có thể đăng nhập với tên đăng nhập/mật khẩu ngay bây giờ.", diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 647b88a7cc..cb2237d3e9 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -28,6 +28,7 @@ "details.grant": "Cấp/Huỷ quyền trưởng nhóm", "details.kick": "Đá ra", "details.kick_confirm": "Bạn có chắc muốn xoá thành viên này khỏi nhóm?", + "details.add-member": "Add Member", "details.owner_options": "Quản trị nhóm", "details.group_name": "Tên nhóm", "details.member_count": "Số thành viên", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index d4417e1d00..57952cc1a2 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -6,7 +6,10 @@ "popular-month": "Chủ đề nổi bật tháng này", "popular-alltime": "Chủ đề nổi bật mọi thời đại", "recent": "Chủ đề gần đây", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 82832d4333..5da052b425 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -31,6 +31,8 @@ "following": "Đang theo dõi", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "Giới thiệu bản thân", "signature": "Chữ ký", "birthday": "Ngày sinh ", @@ -107,7 +109,9 @@ "no-sound": "Không có âm thanh", "upvote-notif-freq": "Tần suất thông báo lượt thích", "upvote-notif-freq.all": "Toàn bộ lượt thích", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Mỗi 10 lượt thích", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Cứ mỗi 10, 100, 1000...", "upvote-notif-freq.disabled": "Bị khóa", "browsing": "Đang xem cài đặt", diff --git a/public/language/zh-CN/admin/settings/advanced.json b/public/language/zh-CN/admin/settings/advanced.json index e81c53baf0..0bd6b55b5c 100644 --- a/public/language/zh-CN/admin/settings/advanced.json +++ b/public/language/zh-CN/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "流量管理", "traffic.help": "NodeBB 拥有在高流量情况下自动拒绝请求的模块。尽管默认值就很棒,但您可以在这里调整这些设置。", "traffic.enable": "启用流量管理", diff --git a/public/language/zh-CN/admin/settings/uploads.json b/public/language/zh-CN/admin/settings/uploads.json index b58fd7478f..9d617da95a 100644 --- a/public/language/zh-CN/admin/settings/uploads.json +++ b/public/language/zh-CN/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "帖子", "allow-files": "允许用户上传普通文件", "private": "使上传的文件私有化", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", "max-image-width": "缩小图片到指定宽度(单位像素)", "max-image-width-help": "(像素单位,默认 760 px,设置为0以禁用)", "resize-image-quality": "调整图像大小时使用的质量", diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index 7812ded126..e046c3d947 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -4,6 +4,8 @@ "invite": "来自%1的邀请", "greeting_no_name": "您好", "greeting_with_name": "%1,您好", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "感谢您注册 %1 帐户!", "welcome.text2": "我们需要在校验您注册时填写的电子邮箱地址后,才能激活您的帐户。", "welcome.text3": "管理员接受了您的注册请求,请用您的用户名和密码登陆。", diff --git a/public/language/zh-CN/groups.json b/public/language/zh-CN/groups.json index bc2d0ee05b..8e29806e64 100644 --- a/public/language/zh-CN/groups.json +++ b/public/language/zh-CN/groups.json @@ -28,6 +28,7 @@ "details.grant": "授予/取消管理权", "details.kick": "踢出群组", "details.kick_confirm": "您确定要将此成员从群组中移除吗?", + "details.add-member": "Add Member", "details.owner_options": "群组管理", "details.group_name": "群组名", "details.member_count": "群组成员数", diff --git a/public/language/zh-CN/pages.json b/public/language/zh-CN/pages.json index 651dd0cdd7..ae46d1680c 100644 --- a/public/language/zh-CN/pages.json +++ b/public/language/zh-CN/pages.json @@ -6,7 +6,10 @@ "popular-month": "当月热门话题", "popular-alltime": "热门主题", "recent": "最新主题", - "top": "票数最高的主题", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "版主工具", "flagged-content": "举报管理", "ip-blacklist": "IP 黑名单", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index a2a91859ae..1d8ba17e48 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -31,6 +31,8 @@ "following": "关注", "blocks": "屏蔽", "block_toggle": "屏蔽该用户", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "关于我", "signature": "签名档", "birthday": "生日", @@ -107,7 +109,9 @@ "no-sound": "无提示音", "upvote-notif-freq": "帖子被顶的通知频率", "upvote-notif-freq.all": "每一次被顶都通知我", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "每10次被顶通知我一次", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "当被顶的数目为10, 100, 1000...时通知我", "upvote-notif-freq.disabled": "任何时候都不要通知我", "browsing": "浏览设置", diff --git a/public/language/zh-TW/admin/settings/advanced.json b/public/language/zh-TW/admin/settings/advanced.json index 16eae5a8bd..e4070ab7be 100644 --- a/public/language/zh-TW/admin/settings/advanced.json +++ b/public/language/zh-TW/admin/settings/advanced.json @@ -12,6 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/zh-TW/admin/settings/uploads.json b/public/language/zh-TW/admin/settings/uploads.json index f08b6efedf..e0382bd8da 100644 --- a/public/language/zh-TW/admin/settings/uploads.json +++ b/public/language/zh-TW/admin/settings/uploads.json @@ -2,6 +2,8 @@ "posts": "Posts", "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", "resize-image-quality": "Quality to use when resizing images", diff --git a/public/language/zh-TW/email.json b/public/language/zh-TW/email.json index cdabece538..437044ec5e 100644 --- a/public/language/zh-TW/email.json +++ b/public/language/zh-TW/email.json @@ -4,6 +4,8 @@ "invite": "邀請來自 %1", "greeting_no_name": "你好", "greeting_with_name": "%1 你好", + "email.verify-your-email.subject": "Please verify your email", + "email.verify.text1": "Your email address has changed!", "welcome.text1": "感謝註冊 %1!", "welcome.text2": "要啟動你的帳戶,我們先要驗證你用作註冊的電子郵件地址", "welcome.text3": "管理者已經批準你的註冊申請。你現在可以使用你的帳號/密碼進行登入。", diff --git a/public/language/zh-TW/groups.json b/public/language/zh-TW/groups.json index 187cf4fd7e..8e96ba7c43 100644 --- a/public/language/zh-TW/groups.json +++ b/public/language/zh-TW/groups.json @@ -28,6 +28,7 @@ "details.grant": "准許/撤銷 所有權", "details.kick": "剔除", "details.kick_confirm": "Are you sure you want to remove this member from the group?", + "details.add-member": "Add Member", "details.owner_options": "群組管理員", "details.group_name": "群組名稱", "details.member_count": "成員數", diff --git a/public/language/zh-TW/pages.json b/public/language/zh-TW/pages.json index 79ad34726d..c624a2ab36 100644 --- a/public/language/zh-TW/pages.json +++ b/public/language/zh-TW/pages.json @@ -6,7 +6,10 @@ "popular-month": "本月受歡迎的主題", "popular-alltime": "所有時間受歡迎的主題", "recent": "近期的主題", - "top": "Top Voted Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", "moderator-tools": "Moderator Tools", "flagged-content": "Flagged Content", "ip-blacklist": "IP Blacklist", diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index 1dfa9d8aae..534ddbb5d3 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -31,6 +31,8 @@ "following": "正在關注", "blocks": "Blocks", "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", "aboutme": "關於我", "signature": "簽名", "birthday": "生日", @@ -107,7 +109,9 @@ "no-sound": "沒有聲音", "upvote-notif-freq": "Upvote Notification Frequency", "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", "upvote-notif-freq.disabled": "Disabled", "browsing": "瀏覽設定", From 148fc96a3aca7566b360f3a584a476174286c474 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 23 Jul 2018 09:29:26 +0000 Subject: [PATCH 042/310] Latest translations and fallbacks --- .../language/bg/admin/settings/advanced.json | 8 +++---- .../language/bg/admin/settings/uploads.json | 4 ++-- public/language/bg/email.json | 4 ++-- public/language/bg/groups.json | 2 +- public/language/bg/pages.json | 8 +++---- public/language/bg/user.json | 8 +++---- public/language/ru/admin/settings/user.json | 22 +++++++++---------- .../ru/admin/settings/web-crawler.json | 16 +++++++------- public/language/ru/groups.json | 2 +- public/language/ru/pages.json | 8 +++---- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/public/language/bg/admin/settings/advanced.json b/public/language/bg/admin/settings/advanced.json index b83d5c3d08..de9700de8b 100644 --- a/public/language/bg/admin/settings/advanced.json +++ b/public/language/bg/admin/settings/advanced.json @@ -12,10 +12,10 @@ "headers.acac": "Удостоверителни данни за разрешаване на управлението на достъпа", "headers.acam": "Методи за разрешаване на управлението на достъпа", "headers.acah": "Заглавки за разрешаване на управлението на достъпа", - "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts": "Стриктна транспортна сигурност", + "hsts.subdomains": "Включване на поддомейните в заглавката на HSTS", + "hsts.preload": "Позволяване на предварителното зареждане на заглавката на HSTS", + "hsts.help": "За този уеб сайт вече има настроена заглавка за HSTS. Можете да изберете дали да включите поддомейните и дали за заредите предварително флаговете в заглавката си. Ако не знаете какво да направите, най-добре не избирайте нищо. Още информация ", "traffic-management": "Управление на трафика", "traffic.help": "NodeBB има вграден модул, който автоматично отказва заявките в натоварените моменти. Можете да настроите поведението тук, въпреки че стойностите по подразбиране са добра отправна точка.", "traffic.enable": "Включване на управлението на трафика", diff --git a/public/language/bg/admin/settings/uploads.json b/public/language/bg/admin/settings/uploads.json index 095ca88306..d5208ee7d7 100644 --- a/public/language/bg/admin/settings/uploads.json +++ b/public/language/bg/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "Публикации", "allow-files": "Позволяване на потребителите да качват обикновени файлове", "private": "Качените файлове да бъдат частни", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "Файлови разширения, които да бъдат частни", + "private-uploads-extensions-help": "Въведете списък от файлови разширения, разделени със запетаи, които искате да бъдат частни (например pdf,xls,doc). Ако оставите това поле празно, всички файлове ще бъдат частни.", "max-image-width": "Намаляване на размера на изображенията до определена ширина (в пиксели)", "max-image-width-help": "(в пиксели; по подразбиране: 760 пиксела. 0 = изключено)", "resize-image-quality": "Качество при преоразмеряване на изображенията", diff --git a/public/language/bg/email.json b/public/language/bg/email.json index c4592fcaef..4c113852d5 100644 --- a/public/language/bg/email.json +++ b/public/language/bg/email.json @@ -4,8 +4,8 @@ "invite": "Покана от %1", "greeting_no_name": "Здравейте", "greeting_with_name": "Здравейте, %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Моля, потвърдете е-пощата си", + "email.verify.text1": "Адресът на е-пощата Ви е променен!", "welcome.text1": "Благодарим Ви, че се регистрирахте в %1", "welcome.text2": "За да активирате напълно акаунта си, трябва да потвърдите е-пощата, с която сте се регистрирали.", "welcome.text3": "Вашата заявка за регистрация беше приета от администратор. Вече можете да се впишете със своето потребителско име и парола.", diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index fb9cdcb115..239e65ae77 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -28,7 +28,7 @@ "details.grant": "Даване/отнемане на собственост", "details.kick": "Изгонване", "details.kick_confirm": "Наистина ли искате да премахнете този член на групата?", - "details.add-member": "Add Member", + "details.add-member": "Добавяне на член", "details.owner_options": "Администрация на групата", "details.group_name": "Име на групата", "details.member_count": "Брой на членовете", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index bcf8887491..f2c8214c8e 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -6,10 +6,10 @@ "popular-month": "Популярните теми този месец", "popular-alltime": "Популярните теми за всички времена", "recent": "Скорошни теми", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Теми с най-много гласове днес", + "top-week": "Теми с най-много гласове тази седмица", + "top-month": "Теми с най-много гласове този месец", + "top-alltime": "Теми с най-много гласове", "moderator-tools": "Модераторски инструменти", "flagged-content": "Докладвано съдържание", "ip-blacklist": "Черен списък за IP адреси", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index d7d821cb7b..6018010509 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -31,8 +31,8 @@ "following": "Следва", "blocks": "Блокира", "block_toggle": "Превключване на блокирането", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Блокиране на потребителя", + "unblock_user": "Отблокиране на потребителя", "aboutme": "За мен", "signature": "Подпис", "birthday": "Рождена дата", @@ -109,9 +109,9 @@ "no-sound": "Без звук", "upvote-notif-freq": "Честота на известията за положителни гласове", "upvote-notif-freq.all": "Всички положителни гласове", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "При първия за публикация", "upvote-notif-freq.everyTen": "На всеки десет положителни гласа", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "на 1, 5, 10, 25, 50, 100, 150, 200…", "upvote-notif-freq.logarithmic": "На 10, 100, 1000…", "upvote-notif-freq.disabled": "Изключено", "browsing": "Настройки за страниците", diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index 664bff67f7..a8b1fd607c 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -1,15 +1,15 @@ { - "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", + "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": "Только email", + "account-settings": "Настройки аккаунта", + "disable-username-changes": "Отключить изменение имени пользователя", "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", diff --git a/public/language/ru/admin/settings/web-crawler.json b/public/language/ru/admin/settings/web-crawler.json index 2e0d31d12b..a9b8769ff1 100644 --- a/public/language/ru/admin/settings/web-crawler.json +++ b/public/language/ru/admin/settings/web-crawler.json @@ -1,10 +1,10 @@ { - "crawlability-settings": "Crawlability Settings", - "robots-txt": "Custom Robots.txt Leave blank for default", - "sitemap-feed-settings": "Sitemap & Feed Settings", - "disable-rss-feeds": "Disable RSS Feeds", - "disable-sitemap-xml": "Disable Sitemap.xml", - "sitemap-topics": "Number of Topics to display in the Sitemap", - "clear-sitemap-cache": "Clear Sitemap Cache", - "view-sitemap": "View Sitemap" + "crawlability-settings": "Настройки сканирования", + "robots-txt": "Свой Robots.txt Оставьте пустым для значений по умолчанию", + "sitemap-feed-settings": "Карта сайта & настройки ленты активности", + "disable-rss-feeds": "Отключить RSS ленты активности", + "disable-sitemap-xml": "Отключить Sitemap.xml", + "sitemap-topics": "Количество тем для отображения в файле Sitemap", + "clear-sitemap-cache": "Очистить кеш sitemap", + "view-sitemap": "Посмотреть карту сайта" } \ No newline at end of file diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 8051d5e3e4..242f94a57b 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -28,7 +28,7 @@ "details.grant": "Выдать/забрать привилегии администратора", "details.kick": "Исключить", "details.kick_confirm": "Вы уверены, что хотите удалить этого участника из группы?", - "details.add-member": "Add Member", + "details.add-member": "Добавить пользователя", "details.owner_options": "Настройки группы", "details.group_name": "Имя группы", "details.member_count": "Количество участников", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 0eeb2c76db..2d9ed9c06c 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -6,10 +6,10 @@ "popular-month": "Популярные темы этого месяца", "popular-alltime": "Популярные темы за всё время", "recent": "Последние темы", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Самые популярные темы за сегодня", + "top-week": "Самые популярные темы за неделю", + "top-month": "Самые популярные темы за месяц", + "top-alltime": "Самые популярные темы", "moderator-tools": "Инструменты модератора", "flagged-content": "Выбранное содержимое", "ip-blacklist": "Чёрный список IP", From c1e98eefa7fe93431ac312ecc0d90314db2c49b1 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Mon, 23 Jul 2018 11:21:36 -0500 Subject: [PATCH 043/310] Allow single-host clusters to not send pubsub and socket.io messages through the database. (#6659) * Allow single-host clusters to not send pubsub and socket.io messages through the database. * Fix lint errors. --- install/package.json | 1 + loader.js | 9 +++++++++ src/pubsub.js | 16 +++++++++++++++- src/socket.io/index.js | 8 +++++++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 94ab028d33..e09864dc4d 100644 --- a/install/package.json +++ b/install/package.json @@ -95,6 +95,7 @@ "serve-favicon": "^2.4.5", "sitemap": "^1.13.0", "socket.io": "2.1.1", + "socket.io-adapter-cluster": "^1.0.1", "socket.io-adapter-mongo": "^2.0.1", "socket.io-client": "2.1.1", "socket.io-redis": "5.2.0", diff --git a/loader.js b/loader.js index 3071a6f8d5..9150c868c8 100644 --- a/loader.js +++ b/loader.js @@ -36,6 +36,10 @@ Loader.init = function (callback) { }; } + if (nconf.get('singleHostCluster')) { + require('socket.io-adapter-cluster/master')(); + } + process.on('SIGHUP', Loader.restart); process.on('SIGUSR2', Loader.reload); process.on('SIGTERM', Loader.stop); @@ -88,6 +92,11 @@ Loader.addWorkerEvents = function (worker) { console.log('[cluster] Reloading...'); Loader.reload(); break; + case 'pubsub': + workers.forEach(function (w) { + w.send(message); + }); + break; } } }); diff --git a/src/pubsub.js b/src/pubsub.js index 6b6f12d171..82c4a1b57b 100644 --- a/src/pubsub.js +++ b/src/pubsub.js @@ -1,5 +1,6 @@ 'use strict'; +var EventEmitter = require('events'); var nconf = require('nconf'); var real; @@ -12,9 +13,22 @@ function get() { var pubsub; if (nconf.get('isCluster') === 'false') { - var EventEmitter = require('events'); pubsub = new EventEmitter(); pubsub.publish = pubsub.emit.bind(pubsub); + } else if (nconf.get('singleHostCluster')) { + pubsub = new EventEmitter(); + pubsub.publish = function (event, data) { + process.send({ + action: 'pubsub', + event: event, + data: data, + }); + }; + process.on('message', function (message) { + if (message && typeof message === 'object' && message.action === 'pubsub') { + pubsub.emit(message.event, message.data); + } + }); } else if (nconf.get('redis')) { pubsub = require('./database/redis/pubsub'); } else if (nconf.get('mongo')) { diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 884a7e432c..bf7d7cdd7d 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -27,7 +27,13 @@ Sockets.init = function (server) { path: nconf.get('relative_path') + '/socket.io', }); - io.adapter(nconf.get('redis') ? require('../database/redis').socketAdapter() : db.socketAdapter()); + if (nconf.get('singleHostCluster')) { + io.adapter(require('socket.io-adapter-cluster')()); + } else if (nconf.get('redis')) { + io.adapter(require('../database/redis').socketAdapter()); + } else { + io.adapter(db.socketAdapter()); + } io.use(socketioWildcard); io.use(authorize); From 506467ad6f3e8261c4f63e04e8f5ad7fce1cef53 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 Jul 2018 10:30:47 -0400 Subject: [PATCH 044/310] closes #6663 --- install/package.json | 4 ++-- public/language/en-GB/modules.json | 3 ++- src/messaging/rooms.js | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/install/package.json b/install/package.json index e09864dc4d..d700ce2647 100644 --- a/install/package.json +++ b/install/package.json @@ -75,9 +75,9 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.5", - "nodebb-theme-persona": "9.0.21", + "nodebb-theme-persona": "9.0.22", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.19", + "nodebb-theme-vanilla": "10.0.20", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", diff --git a/public/language/en-GB/modules.json b/public/language/en-GB/modules.json index 63a464e916..df6ca5568a 100644 --- a/public/language/en-GB/modules.json +++ b/public/language/en-GB/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 219f19513c..6e85e594d0 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -229,6 +229,14 @@ module.exports = function (Messaging) { function (uids, next) { user.getUsersFields(uids, ['uid', 'username', 'picture', 'status'], next); }, + function (users, next) { + db.getObjectField('chat:room:' + roomId, 'owner', function (err, ownerId) { + next(err, users.map(function (user) { + user.isOwner = parseInt(user.uid, 10) === parseInt(ownerId, 10); + return user; + })); + }); + }, ], callback); }; From f27a0d252c40c6b682f7158a0b2ff9404ca0ff27 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 Jul 2018 15:43:54 -0400 Subject: [PATCH 045/310] closes #6664 --- install/package.json | 6 +++--- src/middleware/header.js | 22 ++++++++-------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/install/package.json b/install/package.json index d700ce2647..65b80201a4 100644 --- a/install/package.json +++ b/install/package.json @@ -74,10 +74,10 @@ "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", - "nodebb-theme-lavender": "5.0.5", - "nodebb-theme-persona": "9.0.22", + "nodebb-theme-lavender": "5.0.6", + "nodebb-theme-persona": "9.0.23", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.20", + "nodebb-theme-vanilla": "10.0.21", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", diff --git a/src/middleware/header.js b/src/middleware/header.js index f845d8b4bb..f6ee601b06 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -69,6 +69,7 @@ module.exports = function (middleware) { async.waterfall([ function (next) { async.parallel({ + scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []), isAdmin: function (next) { user.isAdministrator(req.uid, next); }, @@ -194,6 +195,8 @@ module.exports = function (middleware) { templateValues.userJSON = jsesc(JSON.stringify(results.user), { isScriptContext: true }); templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; + templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; + templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; templateValues.useCustomHTML = parseInt(meta.config.useCustomHTML, 10) === 1; templateValues.customHTML = templateValues.useCustomHTML ? meta.config.customHTML : ''; templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; @@ -203,6 +206,11 @@ module.exports = function (middleware) { templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; + templateValues.scripts = results.scripts.map(function (script) { + return { src: script }; + }); + addTimeagoLocaleScript(templateValues.scripts, res.locals.config.userLang); + templateValues.template = { name: res.locals.template }; templateValues.template[res.locals.template] = true; @@ -237,20 +245,6 @@ module.exports = function (middleware) { }, next); }, function (data, next) { - async.parallel({ - scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []), - }, function (err, results) { - next(err, data, results); - }); - }, - function (data, results, next) { - data.templateValues.scripts = results.scripts.map(function (script) { - return { src: script }; - }); - addTimeagoLocaleScript(data.templateValues.scripts, res.locals.config.userLang); - - data.templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; - data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : ''; data.templateValues.isSpider = req.isSpider(); req.app.render('footer', data.templateValues, next); }, From 352bef0a7fb9eee824f46d80455a41daf57a248e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 Jul 2018 15:57:56 -0400 Subject: [PATCH 046/310] eliminate waitSeconds in rjs config --- public/src/require-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/require-config.js b/public/src/require-config.js index a7c70ac70e..2657d4aa33 100644 --- a/public/src/require-config.js +++ b/public/src/require-config.js @@ -2,7 +2,7 @@ require.config({ baseUrl: config.relative_path + '/assets/src/modules', - waitSeconds: 7, + waitSeconds: 0, urlArgs: config['cache-buster'], paths: { forum: '../client', From 3522ad0e059abbebd549a0185de50abc5ab80fa8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 Jul 2018 16:05:05 -0400 Subject: [PATCH 047/310] Revert "closes #6664" This reverts commit f27a0d252c40c6b682f7158a0b2ff9404ca0ff27. --- install/package.json | 6 +++--- src/middleware/header.js | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/install/package.json b/install/package.json index 65b80201a4..d700ce2647 100644 --- a/install/package.json +++ b/install/package.json @@ -74,10 +74,10 @@ "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", - "nodebb-theme-lavender": "5.0.6", - "nodebb-theme-persona": "9.0.23", + "nodebb-theme-lavender": "5.0.5", + "nodebb-theme-persona": "9.0.22", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.21", + "nodebb-theme-vanilla": "10.0.20", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", diff --git a/src/middleware/header.js b/src/middleware/header.js index f6ee601b06..f845d8b4bb 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -69,7 +69,6 @@ module.exports = function (middleware) { async.waterfall([ function (next) { async.parallel({ - scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []), isAdmin: function (next) { user.isAdministrator(req.uid, next); }, @@ -195,8 +194,6 @@ module.exports = function (middleware) { templateValues.userJSON = jsesc(JSON.stringify(results.user), { isScriptContext: true }); templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; - templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; - templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; templateValues.useCustomHTML = parseInt(meta.config.useCustomHTML, 10) === 1; templateValues.customHTML = templateValues.useCustomHTML ? meta.config.customHTML : ''; templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; @@ -206,11 +203,6 @@ module.exports = function (middleware) { templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; - templateValues.scripts = results.scripts.map(function (script) { - return { src: script }; - }); - addTimeagoLocaleScript(templateValues.scripts, res.locals.config.userLang); - templateValues.template = { name: res.locals.template }; templateValues.template[res.locals.template] = true; @@ -245,6 +237,20 @@ module.exports = function (middleware) { }, next); }, function (data, next) { + async.parallel({ + scripts: async.apply(plugins.fireHook, 'filter:scripts.get', []), + }, function (err, results) { + next(err, data, results); + }); + }, + function (data, results, next) { + data.templateValues.scripts = results.scripts.map(function (script) { + return { src: script }; + }); + addTimeagoLocaleScript(data.templateValues.scripts, res.locals.config.userLang); + + data.templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; + data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : ''; data.templateValues.isSpider = req.isSpider(); req.app.render('footer', data.templateValues, next); }, From afa320c9c8595f00149cf00f598a146c7971bf3e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 24 Jul 2018 16:08:17 -0400 Subject: [PATCH 048/310] complete reversion of #6664 --- install/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/package.json b/install/package.json index d700ce2647..ae7fe54dee 100644 --- a/install/package.json +++ b/install/package.json @@ -74,10 +74,10 @@ "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", - "nodebb-theme-lavender": "5.0.5", - "nodebb-theme-persona": "9.0.22", + "nodebb-theme-lavender": "5.0.7", + "nodebb-theme-persona": "9.0.24", "nodebb-theme-slick": "1.2.6", - "nodebb-theme-vanilla": "10.0.20", + "nodebb-theme-vanilla": "10.0.22", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From 519103a7df223f4e92121cc450c01767ebf56f1d Mon Sep 17 00:00:00 2001 From: Anil Mandepudi Date: Tue, 24 Jul 2018 23:16:20 -0700 Subject: [PATCH 049/310] up slick theme --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ae7fe54dee..2b41441dc3 100644 --- a/install/package.json +++ b/install/package.json @@ -76,7 +76,7 @@ "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", "nodebb-theme-persona": "9.0.24", - "nodebb-theme-slick": "1.2.6", + "nodebb-theme-slick": "1.2.8", "nodebb-theme-vanilla": "10.0.22", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", From e534bf803eb4dde9b8af50b944416fb763ef62e9 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 25 Jul 2018 09:29:13 +0000 Subject: [PATCH 050/310] Latest translations and fallbacks --- public/language/ar/modules.json | 3 ++- public/language/bg/modules.json | 3 ++- public/language/bn/modules.json | 3 ++- public/language/cs/modules.json | 3 ++- public/language/da/modules.json | 3 ++- public/language/de/modules.json | 3 ++- public/language/el/modules.json | 3 ++- public/language/en-US/modules.json | 3 ++- public/language/en-x-pirate/modules.json | 3 ++- public/language/es/modules.json | 3 ++- public/language/et/modules.json | 3 ++- public/language/fa-IR/modules.json | 3 ++- public/language/fi/modules.json | 3 ++- public/language/fr/modules.json | 3 ++- public/language/gl/modules.json | 3 ++- public/language/he/modules.json | 3 ++- public/language/hr/modules.json | 3 ++- public/language/hu/modules.json | 3 ++- public/language/id/modules.json | 3 ++- public/language/it/modules.json | 3 ++- public/language/ja/modules.json | 3 ++- public/language/ko/modules.json | 3 ++- public/language/lt/modules.json | 3 ++- public/language/ms/modules.json | 3 ++- public/language/nb/modules.json | 3 ++- public/language/nl/modules.json | 3 ++- public/language/pl/modules.json | 3 ++- public/language/pt-BR/modules.json | 3 ++- public/language/pt-PT/modules.json | 3 ++- public/language/ro/modules.json | 3 ++- public/language/ru/modules.json | 3 ++- public/language/rw/modules.json | 3 ++- public/language/sc/modules.json | 3 ++- public/language/sk/modules.json | 3 ++- public/language/sl/modules.json | 3 ++- public/language/sr/modules.json | 3 ++- public/language/sv/modules.json | 3 ++- public/language/th/modules.json | 3 ++- public/language/tr/modules.json | 3 ++- public/language/uk/modules.json | 3 ++- public/language/vi/modules.json | 3 ++- public/language/zh-CN/modules.json | 3 ++- public/language/zh-TW/modules.json | 3 ++- 43 files changed, 86 insertions(+), 43 deletions(-) diff --git a/public/language/ar/modules.json b/public/language/ar/modules.json index 99aa95c0cf..613ccc76f7 100644 --- a/public/language/ar/modules.json +++ b/public/language/ar/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "هل أنت متأكد من أنك تريد حذف هذه الرسالة؟", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "اكتب", "composer.show_preview": "عرض المعاينة", "composer.hide_preview": "إخفاء المعاينة", diff --git a/public/language/bg/modules.json b/public/language/bg/modules.json index c3cf10545d..f323e4c046 100644 --- a/public/language/bg/modules.json +++ b/public/language/bg/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Наистина ли искате да изтриете това съобщение?", "chat.retrieving-users": "Получаване на потребителите…", "chat.manage-room": "Управление на стаята за разговори", - "chat.add-user-help": "Тук можете да потърсите потребители. Когато някой потребител бъде избран, той ще бъде добавен в разговора. Новият потребител няма да може да вижда съобщенията, написани преди включването му в разговора. Само собствениците на стаята могат да премахват потребители от нея.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Този потребител е в състояние „не ме безпокойте“. Наистина ли искате да разговаряте с него?", "chat.rename-room": "Преименуване на стаята", "chat.rename-placeholder": "Въведете името на стаята си тук", @@ -33,6 +33,7 @@ "chat.in-room": "В тази стая", "chat.kick": "Изгонване", "chat.show-ip": "Показване на IP адреса", + "chat.owner": "Room Owner", "composer.compose": "Писане", "composer.show_preview": "Показване на прегледа", "composer.hide_preview": "Скриване на прегледа", diff --git a/public/language/bn/modules.json b/public/language/bn/modules.json index 45c0a60a5a..4169287d86 100644 --- a/public/language/bn/modules.json +++ b/public/language/bn/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index fc739f3bbe..cca5e31f1a 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Jste si jist/a, že chcete odstranit tuto zprávu?", "chat.retrieving-users": "Získávání seznamu uživatelů...", "chat.manage-room": "Spravovat konverzační místnosti", - "chat.add-user-help": "Zde můžete vyhledat uživatele. Při výběru bude daný uživatel přidán do konverzace. Nový uživatelé nebudou mít zobrazeny zprávy napsané před jejich připojení ke konverzaci. Jen vlastníci místnosti mohou mazat uživatele ze svých konverzačních místností.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Tento uživatel nastavil svůj stav na NERUŠIT. Opravdu chcete začít s ním konverzaci.", "chat.rename-room": "Přejmenovat místnost", "chat.rename-placeholder": "Zde zadejte název místnosti", @@ -33,6 +33,7 @@ "chat.in-room": "V této místnosti", "chat.kick": "Vykopnout", "chat.show-ip": "Zobrazit IP", + "chat.owner": "Room Owner", "composer.compose": "Napsat", "composer.show_preview": "Ukázat náhled", "composer.hide_preview": "Skrýt náhled", diff --git a/public/language/da/modules.json b/public/language/da/modules.json index 469bd13d2f..85216d7d3b 100644 --- a/public/language/da/modules.json +++ b/public/language/da/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Er du sikker på at du vil slette denne besked?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Skriv", "composer.show_preview": "Vis forhåndsvisning", "composer.hide_preview": "Fjern forhåndsvisning", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 8089335c1e..7fa904945d 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Bist du sicher, dass du diese Nachricht löschen möchtest?", "chat.retrieving-users": "Rufe Benutzer ab", "chat.manage-room": "Chat-Room managen", - "chat.add-user-help": "Suche hier nach Benutzern. Der Benutzer wird dem Chat hinzugefügt indem man diesen auswählt. Der Benutzer wird nicht in der Lage sein Chat-Nachrichten zu sehen, die geschrieben wurden, bevor er der Konversation beigetreten ist. Es ist ausschließlich Besitzern eines Chat-Raums vorbehalten Benutzer zu entfernen.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Dieser Benutzer hat seinen Status auf DnD (Bitte nicht stören) gesetzt. Möchtest du dennoch mit ihm chatten?", "chat.rename-room": "Raum umbenennen", "chat.rename-placeholder": "Gib deinen Chatraumnamen hier ein", @@ -33,6 +33,7 @@ "chat.in-room": "In diesem Chat-Room", "chat.kick": "Rauswerfen", "chat.show-ip": "IP anzeigen", + "chat.owner": "Room Owner", "composer.compose": "Verfassen", "composer.show_preview": "Vorschau zeigen", "composer.hide_preview": "Vorschau ausblenden", diff --git a/public/language/el/modules.json b/public/language/el/modules.json index 667f037894..bcb2d1c500 100644 --- a/public/language/el/modules.json +++ b/public/language/el/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/en-US/modules.json b/public/language/en-US/modules.json index 667f037894..bcb2d1c500 100644 --- a/public/language/en-US/modules.json +++ b/public/language/en-US/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/en-x-pirate/modules.json b/public/language/en-x-pirate/modules.json index 589c0826a2..aa5a966320 100644 --- a/public/language/en-x-pirate/modules.json +++ b/public/language/en-x-pirate/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/es/modules.json b/public/language/es/modules.json index e323cff8c9..c53a6591ff 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "¿Estás seguro de que deseas eliminar este mensaje?", "chat.retrieving-users": "Cargando usuarios...", "chat.manage-room": "Administrar Sala de Chat", - "chat.add-user-help": "Buscar usuarios aquí. Cuando se seleccione, el usuario será añadido al chat. El nuevo usuario no será capaz de ver mensajes de chat escritos antes de que fueran añadidos a la conversación. Sólo los dueños de la sala pueden eliminar usuarios de una sala de chat.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Este usuario está en modo No molestar. ¿ Estás seguro de que quieres chatear con él ?", "chat.rename-room": "Renombrar Sala", "chat.rename-placeholder": "Introduzca el nombre de su sala aquí", @@ -33,6 +33,7 @@ "chat.in-room": "En esta sala", "chat.kick": "Expulsar", "chat.show-ip": "Mostrar IP", + "chat.owner": "Room Owner", "composer.compose": "Crear", "composer.show_preview": "Ver Previsualización", "composer.hide_preview": "Ocultar Previsualización", diff --git a/public/language/et/modules.json b/public/language/et/modules.json index 29f30644c4..24af2026d6 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Oled kindel, et soovid selle sõnumi kustutada?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Koosta", "composer.show_preview": "Kuva eelvaadet", "composer.hide_preview": "Peida eelvaade", diff --git a/public/language/fa-IR/modules.json b/public/language/fa-IR/modules.json index 7445d4ab18..9a88e5346f 100644 --- a/public/language/fa-IR/modules.json +++ b/public/language/fa-IR/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "آیا مطمئن هستید که می خواهید این پیام را حذف کنید؟", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "این کاربر وضعیت خود را روی حالت مزاحم نشوید قرار داده است. آیا همچنان می خواهید با او چت کنید؟", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "ارسال", "composer.show_preview": "نمایش پیش‌نمایش", "composer.hide_preview": "مخفی کردن پیش‌نمایش", diff --git a/public/language/fi/modules.json b/public/language/fi/modules.json index 3e05a6a075..055f2119ea 100644 --- a/public/language/fi/modules.json +++ b/public/language/fi/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index d87bf58486..34c81da428 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "chat.retrieving-users": "Ajouter des utilisateurs ...", "chat.manage-room": "Gérer l'espace de discussion", - "chat.add-user-help": "Rechercher des utilisateurs ici. Lorsque cette option est sélectionnée, l'utilisateur sera ajouté au chat. Le nouvel utilisateur ne pourra pas voir les messages de chat écrits avant d'être ajoutés à la conversation. Seuls les propriétaires de salle peuvent supprimer des utilisateurs des salles de conversation.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Cet utilisateur a son statut en mode \"Ne pas déranger\". Voulez-vous quand même discuter avec lui ?", "chat.rename-room": "Renommer l'espace de discussion ", "chat.rename-placeholder": "Entrer le nom ici ", @@ -33,6 +33,7 @@ "chat.in-room": "Dans cet espace de discussion", "chat.kick": "Exclure", "chat.show-ip": "Voir IP", + "chat.owner": "Room Owner", "composer.compose": "Écrire", "composer.show_preview": "Afficher l'aperçu", "composer.hide_preview": "Masquer l'aperçu", diff --git a/public/language/gl/modules.json b/public/language/gl/modules.json index 3d4ff3647c..89da74e2f8 100644 --- a/public/language/gl/modules.json +++ b/public/language/gl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Estás seguro de que desexas eliminar esta mensaxe?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Elaborar", "composer.show_preview": "Amosar vista previa", "composer.hide_preview": "Agochar vista previa", diff --git a/public/language/he/modules.json b/public/language/he/modules.json index 494421f225..0eccf675cc 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "האם אתה בטוח שברצונך למחוק הודעה זו?", "chat.retrieving-users": "שולף משתמשים", "chat.manage-room": "נהל חדר צ'אט", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "משתמש זה שינה את הסטטוס שלו ל 'לא להפריע'. אתה עדיין מעוניין לשוחח איתו?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "הזן את שם החדר שלך כאן", @@ -33,6 +33,7 @@ "chat.in-room": "בתוך החדר הזה", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "צור", "composer.show_preview": "הצג תצוגה מקדימה", "composer.hide_preview": "הסתר תצוגה מקדימה", diff --git a/public/language/hr/modules.json b/public/language/hr/modules.json index 9087b681eb..fe592391c3 100644 --- a/public/language/hr/modules.json +++ b/public/language/hr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Sigurni ste da želite izbrisati ovu poruku?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Korisnik ne želi biti ometan. Jeste li sigurno da mu želite poslati poruku?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Sastavi", "composer.show_preview": "Prikaz", "composer.hide_preview": "Sakrij prikaz", diff --git a/public/language/hu/modules.json b/public/language/hu/modules.json index 7cd087a675..a68b439693 100644 --- a/public/language/hu/modules.json +++ b/public/language/hu/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Biztos törölni akarod az üzenetet?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "A felhasználó \"ne zavarj\"-ra állította az állapotukat. Még így is csevegni akarsz velük?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Üzenetírás", "composer.show_preview": "Előnézet megjelenítése", "composer.hide_preview": "Előnézet elrejtése", diff --git a/public/language/id/modules.json b/public/language/id/modules.json index eb14bbb5d4..e5c308b33c 100644 --- a/public/language/id/modules.json +++ b/public/language/id/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/it/modules.json b/public/language/it/modules.json index 1941bb8a61..d0441a23c9 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Sei sicuro di voler eliminare questo messaggio?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Questo utente ha impostato il suo stato su Non Disturbare. Sei sicuro di voler iniziare una conversazione?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Componi", "composer.show_preview": "Visualizza Anteprima", "composer.hide_preview": "Nascondi Anteprima", diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 371006a1a2..22f1ccd4c8 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "本当にこのメッセージを削除しますか?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "このユーザーのステータスはDnD(Do not disturb:取り込み中)に設定されています。あなたはまだチャットしたいですか?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "構成", "composer.show_preview": "プレビュー表示", "composer.hide_preview": "プレビュー非表示", diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index 288b79222f..660edb2ae2 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "이 메세지를 삭제 하시겠습니까?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "이 사용자의 상태는 \"방해금지\" 입니다. 그래도 대화를 요청 하시겠습니까?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "작성", "composer.show_preview": "미리보기", "composer.hide_preview": "미리보기 숨김", diff --git a/public/language/lt/modules.json b/public/language/lt/modules.json index b99cd9c0e9..871a55d8a0 100644 --- a/public/language/lt/modules.json +++ b/public/language/lt/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Sukomponuoti", "composer.show_preview": "Rodyti pavyzdį", "composer.hide_preview": "Slėpti pavyzdį", diff --git a/public/language/ms/modules.json b/public/language/ms/modules.json index 4ad5a1e975..be2f54c915 100644 --- a/public/language/ms/modules.json +++ b/public/language/ms/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Tulis", "composer.show_preview": "Pra-lihat", "composer.hide_preview": "Sorok pra-lihat", diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index 9e20c1a8eb..73d2e8d75a 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Komponer", "composer.show_preview": "Vis forhåndsvisning", "composer.hide_preview": "Skjul forhåndsvisning", diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index cf589b28db..d97713b793 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Weet je zeker dat je dit bericht wilt verwijderen?", "chat.retrieving-users": "Gebruikers ophalen...", "chat.manage-room": "Chat Room beheren", - "chat.add-user-help": "Zoek hier naar gebruikers. Indien geselecteerd word de gebruiker toegevoegd aan de chat. De nieuwe gebruiker kan geen chatberichten zien die geschreven zijn voordat de gebruiker was toegevoegd aan de conversatie. Alleen chatroom-eigenaren kunnen gebruikers verwijderen uit een chatroom.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Deze gebruiker heeft de status op Niet Storen (DnD, Do not disturb) gezet. Wil je nog steeds een chat starten met deze persoon?", "chat.rename-room": "Hernoem chatroom", "chat.rename-placeholder": "Voer hier de naam van je chat room in", @@ -33,6 +33,7 @@ "chat.in-room": "In deze chat room", "chat.kick": "Schop", "chat.show-ip": "Geef IP weer", + "chat.owner": "Room Owner", "composer.compose": "Samenstellen", "composer.show_preview": "Voorbeeldweergave", "composer.hide_preview": "Verberg voorbeeld", diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index d1269ade4d..f27700efc0 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Czy na pewno chcesz usunąć tę wiadomość?", "chat.retrieving-users": "Pobieram użytkowników...", "chat.manage-room": "Zarządzaj pokojami czatu", - "chat.add-user-help": "Tu można wyszukiwać użytkowników. Wybrany użytkownik zostanie dodany do czatu. Nowy użytkownik nie zobaczy wiadomości sprzed dołączenia do konwersacji. Tylko właściciele pokoi mogą usuwać użytkowników z pokoi czatu.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Ten użytkownik ustawił status „nie przeszkadzać”. Czy chcesz z nim rozmawiać mimo to?", "chat.rename-room": "Zmień nazwę pokoju", "chat.rename-placeholder": "Tu wpisz nazwę pokoju", @@ -33,6 +33,7 @@ "chat.in-room": "W tym pokoju", "chat.kick": "Wyrzuć", "chat.show-ip": "Pokaż IP", + "chat.owner": "Room Owner", "composer.compose": "Napisz", "composer.show_preview": "Pokaż podgląd", "composer.hide_preview": "Ukryj podgląd", diff --git a/public/language/pt-BR/modules.json b/public/language/pt-BR/modules.json index f7edfa2723..2f8c53d5e7 100644 --- a/public/language/pt-BR/modules.json +++ b/public/language/pt-BR/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Tem certeza que deseja excluir esta mensagem?", "chat.retrieving-users": "Carregando usuários", "chat.manage-room": "Administrar conversa", - "chat.add-user-help": "Busque por usuários. Quando selecionado, o usuário será adicionado a conversa. O novo usuário não verá as mensagens enviadas antes de sua entrada na conversa. Apenas os donos da sala poderão remover usuários da sala", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Este usuário definiu seu estado como DnD(Do not disturb─Não perturbe). Você ainda assim quer conversar com ele?", "chat.rename-room": "Renomear sala", "chat.rename-placeholder": "Entre com o nome da sala", @@ -33,6 +33,7 @@ "chat.in-room": "Nesta sala", "chat.kick": "Expulsar", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compor", "composer.show_preview": "Exibir Pré-visualização", "composer.hide_preview": "Esconder Pré-visualização", diff --git a/public/language/pt-PT/modules.json b/public/language/pt-PT/modules.json index 096b0ef76b..2468864719 100644 --- a/public/language/pt-PT/modules.json +++ b/public/language/pt-PT/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Tens a certeza que desejas apagar esta mensagem?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compor", "composer.show_preview": "Mostrar pré-visualização", "composer.hide_preview": "Ocultar pré-visualização", diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json index 6cf852af4b..0106b2cfa2 100644 --- a/public/language/ro/modules.json +++ b/public/language/ro/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Scrie", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 1533b92b15..7d21affc0f 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Вы уверены, что хотите удалить это сообщение?", "chat.retrieving-users": "Получение списка пользователей...", "chat.manage-room": "Управлять комнатой чата", - "chat.add-user-help": "Поиск пользователей здесь. Когда выбрали пользователя, он будет добавлен в чат. Новый пользователь не сможет видеть сообщения чата, написанные до его добавления в беседу. Только владельцы комнат могут удалить пользователей из чатов.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Этот пользователь установил статус \"Не беспокоить\". Вы все еще хотите написать ему?", "chat.rename-room": "Переименовать комнату", "chat.rename-placeholder": "Введите название комнаты здесь", @@ -33,6 +33,7 @@ "chat.in-room": "В этой комнате", "chat.kick": "Исключить", "chat.show-ip": "Показать IP", + "chat.owner": "Room Owner", "composer.compose": "Редактор сообщений", "composer.show_preview": "Показать предпросмотр сообщения", "composer.hide_preview": "Скрыть предпросмотр", diff --git a/public/language/rw/modules.json b/public/language/rw/modules.json index 9c57d2cc10..e223b56195 100644 --- a/public/language/rw/modules.json +++ b/public/language/rw/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Wiringiye neza ko ushaka gusiba ubu butumwa?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Andika", "composer.show_preview": "Bona Uko Biza Gusa", "composer.hide_preview": "Hisha Uko Biza Gusa", diff --git a/public/language/sc/modules.json b/public/language/sc/modules.json index 8eb8decda0..1478862b30 100644 --- a/public/language/sc/modules.json +++ b/public/language/sc/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Are you sure you wish to delete this message?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Compose", "composer.show_preview": "Show Preview", "composer.hide_preview": "Hide Preview", diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index a4941e6a2b..65bf7638e8 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Ste si istý, že chcete odstrániť túto správu?", "chat.retrieving-users": "Získavanie zoznamu používateľov...", "chat.manage-room": "Spravovať konverzačné miestnosti", - "chat.add-user-help": "Tu môžete vyhľadať používateľov. Pri výbere bude daný používateľ pridaný do konverzácie. Nový používatelia nebudú mať zobrazené správy napísané pred ich pripojením ku konverzácií. Iba vlastníci miestností môžu odstrániť používateľov zo svojich konverzačných miestností.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Tento používateľ nastavil svoj stav na NERUŠIŤ. Naozaj chcete s ním začať konverzáciu?", "chat.rename-room": "Premenovať miestnosť", "chat.rename-placeholder": "Sem zadajte názov miestnosti", @@ -33,6 +33,7 @@ "chat.in-room": "V tejto miestnosti", "chat.kick": "Vykopnúť", "chat.show-ip": "Zobraziť IP adresu", + "chat.owner": "Room Owner", "composer.compose": "Napísať", "composer.show_preview": "Zobraziť náhľad", "composer.hide_preview": "Skryť náhľad", diff --git a/public/language/sl/modules.json b/public/language/sl/modules.json index c42be27c71..ca3d0656ed 100644 --- a/public/language/sl/modules.json +++ b/public/language/sl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Ali ste prepričani, da želite izbrisati to sporočilo?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Sestavljanje", "composer.show_preview": "Pokaži predogled", "composer.hide_preview": "Skrij predogled", diff --git a/public/language/sr/modules.json b/public/language/sr/modules.json index 58cad4389c..794b71838a 100644 --- a/public/language/sr/modules.json +++ b/public/language/sr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Да ли сте сигурни да желите да избришете ову поруку?", "chat.retrieving-users": "Преузимање корисника...", "chat.manage-room": "Управљај собама за ћаскање", - "chat.add-user-help": "Потражите кориснике овде. Када буде изабран, корисник ће бити додан у ћаскање. Нови корисник неће бити у могућности да види поруке написане пре него што је додан у преписку. Само власници соба могу уклонити кориснике из соба за ћаскање.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Овај корисник је поставио свој статус на \"Не узнемиравај\". Да ли и даље желите да ћаскате са њим?", "chat.rename-room": "Преименуј собу", "chat.rename-placeholder": "Унесите назив собе овде", @@ -33,6 +33,7 @@ "chat.in-room": "У овој соби", "chat.kick": "Избаци", "chat.show-ip": "Прикажи IP", + "chat.owner": "Room Owner", "composer.compose": "Писање поруке", "composer.show_preview": "Прикажи преглед", "composer.hide_preview": "Сакриј преглед", diff --git a/public/language/sv/modules.json b/public/language/sv/modules.json index 866ffb804f..cd8e059e2a 100644 --- a/public/language/sv/modules.json +++ b/public/language/sv/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Är du säker på att du vill radera det här meddelandet?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Komponera", "composer.show_preview": "Visa förhandsgranskning", "composer.hide_preview": "Dölj förhandsgranskning", diff --git a/public/language/th/modules.json b/public/language/th/modules.json index 0235d4882c..bfa1ef059d 100644 --- a/public/language/th/modules.json +++ b/public/language/th/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "คุณแน่ใจแล้วใช่ไหมว่าต้องการจะลบข้อความนี้?", "chat.retrieving-users": "กำลังเรียกข้อมูลผู้ใช้", "chat.manage-room": "จัดการห้องแชท", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "ผู้ใช้นี้ได้ตั้งค่าสถานะเป็น (ห้ามรบกวน) คุณยังอยากจะคุยกับเขาอยู่ไหม?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "ใส่ชื่อห้องของคุณที่นี่", @@ -33,6 +33,7 @@ "chat.in-room": "ในห้องนี้", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "เขียน", "composer.show_preview": "แสดงพรีวิว", "composer.hide_preview": "ซ่อนพรีวิว", diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index fdf666dd78..bcc332a749 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Bu mesajı silmek istediğinden emin misin?", "chat.retrieving-users": "Kullanıcılar alınıyor ...", "chat.manage-room": "Sohbet Odasını Yönet", - "chat.add-user-help": "Burada kullanıcılar için arama yapın. Kullanıcı seçildiğinde sohbete eklenecektir. Yeni kullanıcı sohbete eklenmeden önce yazılmış olan sohbet mesajlarını göremeyecektir. Yalnızca oda sahipleri kullanıcıları sohbet odalarından kaldırabilir.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Bu kullanıcı durumunu rahatsız etmeyin olarak ayarladı. Hala onunla sohbet etmek istiyor musun?", "chat.rename-room": "Odanın adını değiştir", "chat.rename-placeholder": "Oda isminizi buraya girin", @@ -33,6 +33,7 @@ "chat.in-room": "Bu odada", "chat.kick": "Dışarı At", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Yaz", "composer.show_preview": "Önizleme Göster", "composer.hide_preview": "Önizleme Sakla", diff --git a/public/language/uk/modules.json b/public/language/uk/modules.json index d45d8daa20..3fd8ea07a5 100644 --- a/public/language/uk/modules.json +++ b/public/language/uk/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Ви впевнені, що хочете видалити це повідомлення?", "chat.retrieving-users": "Отримання користувачів...", "chat.manage-room": "Управління чат кімнатами", - "chat.add-user-help": "Шукайте користувачів тут. Після обрання користувача його буде додано до чату. Новий користувач не зможе бачити повідомлення чату, написані до того, як його було додано до розмови. Тільки власники кімнат можуть видаляти користувачів з кімнат чату.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "Користувач змінив свій статус на DnD (Не турбувати). Ви дійсно бажаєте надіслати йому повідомлення в чат?", "chat.rename-room": "Перейменувати Кімнату", "chat.rename-placeholder": "Введіть назву своєї кімнати тут", @@ -33,6 +33,7 @@ "chat.in-room": "У цій кімнаті", "chat.kick": "Штурхнути", "chat.show-ip": "Показати IP", + "chat.owner": "Room Owner", "composer.compose": "Редактор повідомлень", "composer.show_preview": "Показати попередній перегляд", "composer.hide_preview": "Сховати попередній перегляд", diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index 1a9aa08406..1e09f33221 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Bạn có chắc chắn bạn muốn xoá tin nhắn này chứ?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "Soạn thảo", "composer.show_preview": "Hiện Xem trước", "composer.hide_preview": "Ẩn Xem trước", diff --git a/public/language/zh-CN/modules.json b/public/language/zh-CN/modules.json index cfd3d9e4e9..503f790fc8 100644 --- a/public/language/zh-CN/modules.json +++ b/public/language/zh-CN/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "您确定删除此消息吗?", "chat.retrieving-users": "查找用户", "chat.manage-room": "管理聊天室", - "chat.add-user-help": "在这里查找更多用户。选中之后添加到聊天中,新用户在加入聊天之前看不到聊天消息。只有聊天室所有者可以从聊天室中移除用户。", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "该用户已将其状态设置为 DnD(请勿打扰)。 您仍希望与其聊天吗?", "chat.rename-room": "重命名房间", "chat.rename-placeholder": "在这里输入房间名字", @@ -33,6 +33,7 @@ "chat.in-room": "在此房间", "chat.kick": "踢出", "chat.show-ip": "显示 IP", + "chat.owner": "Room Owner", "composer.compose": "编写帮助", "composer.show_preview": "显示预览", "composer.hide_preview": "隐藏预览", diff --git a/public/language/zh-TW/modules.json b/public/language/zh-TW/modules.json index 78df5d5ccf..2be9ff9fa5 100644 --- a/public/language/zh-TW/modules.json +++ b/public/language/zh-TW/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "你確定要刪除這個訊息?", "chat.retrieving-users": "Retrieving users...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners may remove users from chat rooms.", + "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -33,6 +33,7 @@ "chat.in-room": "In this room", "chat.kick": "Kick", "chat.show-ip": "Show IP", + "chat.owner": "Room Owner", "composer.compose": "撰寫", "composer.show_preview": "顯示預覽", "composer.hide_preview": "隱藏預覽", From 44373afc52f0137ff443444da3e29583bd661bad Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Wed, 25 Jul 2018 10:04:18 -0500 Subject: [PATCH 051/310] Fix socket.io not working properly in single-host clusters. (#6669) This is because we don't use the cluster module, so the master nodejs process doesn't know about any of the clients through the socket API. --- loader.js | 11 +++--- src/socket.io/index.js | 4 ++- src/socket.io/single-host-cluster.js | 54 ++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 src/socket.io/single-host-cluster.js diff --git a/loader.js b/loader.js index 9150c868c8..007292bb7c 100644 --- a/loader.js +++ b/loader.js @@ -36,10 +36,6 @@ Loader.init = function (callback) { }; } - if (nconf.get('singleHostCluster')) { - require('socket.io-adapter-cluster/master')(); - } - process.on('SIGHUP', Loader.restart); process.on('SIGUSR2', Loader.reload); process.on('SIGTERM', Loader.stop); @@ -97,6 +93,13 @@ Loader.addWorkerEvents = function (worker) { w.send(message); }); break; + case 'socket.io': + workers.forEach(function (w) { + if (w !== worker) { + w.send(message); + } + }); + break; } } }); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index bf7d7cdd7d..964ebf728c 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -28,7 +28,9 @@ Sockets.init = function (server) { }); if (nconf.get('singleHostCluster')) { - io.adapter(require('socket.io-adapter-cluster')()); + io.adapter(require('socket.io-adapter-cluster')({ + client: require('./single-host-cluster'), + })); } else if (nconf.get('redis')) { io.adapter(require('../database/redis').socketAdapter()); } else { diff --git a/src/socket.io/single-host-cluster.js b/src/socket.io/single-host-cluster.js new file mode 100644 index 0000000000..c7ca938766 --- /dev/null +++ b/src/socket.io/single-host-cluster.js @@ -0,0 +1,54 @@ +'use strict'; + +var Client = { + sendMessage: function (channel, message) { + process.send({ + action: 'socket.io', + channel: channel, + message: message, + }); + }, + trigger: function (channel, message) { + Client.message.concat(Client.pmessage).forEach(function (callback) { + setImmediate(function () { + callback.call(Client, channel, message); + }); + }); + }, + publish: function (channel, message) { + Client.sendMessage(channel, message); + }, + // we don't actually care about which channels we're subscribed to + subscribe: function () {}, + psubscribe: function () {}, + unsubscribe: function () {}, + unpsubscribe: function () {}, + message: [], + pmessage: [], + on: function (event, callback) { + if (event !== 'message' && event !== 'pmessage') { + return; + } + Client[event].push(callback); + }, + off: function (event, callback) { + if (event !== 'message' && event !== 'pmessage') { + return; + } + if (callback) { + Client[event] = Client[event].filter(function (c) { + return c !== callback; + }); + } else { + Client[event] = []; + } + }, +}; + +process.on('message', function (message) { + if (message && typeof message === 'object' && message.action === 'socket.io') { + Client.trigger(message.channel, message.message); + } +}); + +module.exports = Client; From d06f795856470fde7bbbdf721030e0cd02b529f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 25 Jul 2018 11:16:45 -0400 Subject: [PATCH 052/310] fix scroll on back --- public/src/modules/handleBack.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/src/modules/handleBack.js b/public/src/modules/handleBack.js index 6a11ebc45e..94e7125f52 100644 --- a/public/src/modules/handleBack.js +++ b/public/src/modules/handleBack.js @@ -35,10 +35,14 @@ define('handleBack', [ storage.removeItem('category:bookmark'); storage.removeItem('category:bookmark:clicked'); + if (!utils.isNumber(bookmarkIndex)) { + return; + } bookmarkIndex = Math.max(0, parseInt(bookmarkIndex, 10) || 0); clickedIndex = Math.max(0, parseInt(clickedIndex, 10) || 0); - if (!utils.isNumber(bookmarkIndex)) { + + if (!bookmarkIndex && !clickedIndex) { return; } From 609f711db01a418f1e92634ac65fe2b5af132c06 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 Jul 2018 14:15:36 -0400 Subject: [PATCH 053/310] added logic to handle Chats.switchChat being called with no arguments --- public/src/client/chats.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 244542ead6..77dbab488a 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -58,6 +58,10 @@ define('forum/chats', [ Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content')); Chats.addCharactersLeftHandler($('[component="chat/main-wrapper"]')); Chats.addIPHandler($('[component="chat/main-wrapper"]')); + + $('[data-action="close"]').on('click', function () { + Chats.switchChat(); + }); }; Chats.addIPHandler = function (container) { @@ -385,6 +389,11 @@ define('forum/chats', [ }; Chats.switchChat = function (roomid) { + // Allow empty arg for return to chat list/close chat + if (!roomid) { + roomid = ''; + } + var url = 'user/' + ajaxify.data.userslug + '/chats/' + roomid; if (self.fetch) { fetch(config.relative_path + '/api/' + url, { credentials: 'include' }) From bd85611964bbfab33d889931802bd7942c896fb5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 25 Jul 2018 14:17:05 -0400 Subject: [PATCH 054/310] bump vanilla --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 2b41441dc3..99edf850c7 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "nodebb-theme-lavender": "5.0.7", "nodebb-theme-persona": "9.0.24", "nodebb-theme-slick": "1.2.8", - "nodebb-theme-vanilla": "10.0.22", + "nodebb-theme-vanilla": "10.1.0", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From 565893501ce3e226e3a479c3e5c4974669498520 Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Wed, 25 Jul 2018 18:34:00 -0400 Subject: [PATCH 055/310] up slick --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 99edf850c7..a3cdb102b2 100644 --- a/install/package.json +++ b/install/package.json @@ -76,7 +76,7 @@ "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", "nodebb-theme-persona": "9.0.24", - "nodebb-theme-slick": "1.2.8", + "nodebb-theme-slick": "1.2.9", "nodebb-theme-vanilla": "10.1.0", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", From ee6d4fabd64b15ed83c8a7ada70ad5b61a551804 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 26 Jul 2018 09:29:19 +0000 Subject: [PATCH 056/310] Latest translations and fallbacks --- public/language/bg/modules.json | 4 ++-- public/language/fr/modules.json | 4 ++-- public/language/zh-CN/admin/settings/advanced.json | 8 ++++---- public/language/zh-CN/admin/settings/uploads.json | 4 ++-- public/language/zh-CN/email.json | 4 ++-- public/language/zh-CN/groups.json | 2 +- public/language/zh-CN/modules.json | 4 ++-- public/language/zh-CN/pages.json | 8 ++++---- public/language/zh-CN/user.json | 8 ++++---- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/public/language/bg/modules.json b/public/language/bg/modules.json index f323e4c046..8dc6d424f4 100644 --- a/public/language/bg/modules.json +++ b/public/language/bg/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Наистина ли искате да изтриете това съобщение?", "chat.retrieving-users": "Получаване на потребителите…", "chat.manage-room": "Управление на стаята за разговори", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Тук можете да потърсите потребители. Когато някой потребител бъде избран, той ще бъде добавен в разговора. Новият потребител няма да може да вижда съобщенията, написани преди включването му в разговора. Само собствениците на стаята () могат да премахват потребители от нея.", "chat.confirm-chat-with-dnd-user": "Този потребител е в състояние „не ме безпокойте“. Наистина ли искате да разговаряте с него?", "chat.rename-room": "Преименуване на стаята", "chat.rename-placeholder": "Въведете името на стаята си тук", @@ -33,7 +33,7 @@ "chat.in-room": "В тази стая", "chat.kick": "Изгонване", "chat.show-ip": "Показване на IP адреса", - "chat.owner": "Room Owner", + "chat.owner": "Собственик на стаята", "composer.compose": "Писане", "composer.show_preview": "Показване на прегледа", "composer.hide_preview": "Скриване на прегледа", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 34c81da428..cc9a26f701 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "chat.retrieving-users": "Ajouter des utilisateurs ...", "chat.manage-room": "Gérer l'espace de discussion", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Rechercher des utilisateurs ici. Lorsque cette option est sélectionnée, l'utilisateur sera ajouté à l'espace de discussion. Le nouvel utilisateur ne pourra pas visualiser les échanges avant d'être ajoutés à la conversation. Seuls les propriétaires de l'espace de discussion () peuvent supprimer des utilisateurs.", "chat.confirm-chat-with-dnd-user": "Cet utilisateur a son statut en mode \"Ne pas déranger\". Voulez-vous quand même discuter avec lui ?", "chat.rename-room": "Renommer l'espace de discussion ", "chat.rename-placeholder": "Entrer le nom ici ", @@ -33,7 +33,7 @@ "chat.in-room": "Dans cet espace de discussion", "chat.kick": "Exclure", "chat.show-ip": "Voir IP", - "chat.owner": "Room Owner", + "chat.owner": "Espace Admin", "composer.compose": "Écrire", "composer.show_preview": "Afficher l'aperçu", "composer.hide_preview": "Masquer l'aperçu", diff --git a/public/language/zh-CN/admin/settings/advanced.json b/public/language/zh-CN/admin/settings/advanced.json index 0bd6b55b5c..e529e0b7f0 100644 --- a/public/language/zh-CN/admin/settings/advanced.json +++ b/public/language/zh-CN/admin/settings/advanced.json @@ -12,10 +12,10 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", - "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts": "严格安全传输(HSTS)", + "hsts.subdomains": "HSTS头信息包含的域名", + "hsts.preload": "允许在HSTS头信息中预加载(preloading)", + "hsts.help": "可以为此站点预配置HSTS头信息了。您可以选择是否在头信息(HSTS Hesder)中添加子域(subdomains)或预加载(preloading)标志。 如果你不知道HSTS是什么,您可以不设置此项。更多信息", "traffic-management": "流量管理", "traffic.help": "NodeBB 拥有在高流量情况下自动拒绝请求的模块。尽管默认值就很棒,但您可以在这里调整这些设置。", "traffic.enable": "启用流量管理", diff --git a/public/language/zh-CN/admin/settings/uploads.json b/public/language/zh-CN/admin/settings/uploads.json index 9d617da95a..431c079d77 100644 --- a/public/language/zh-CN/admin/settings/uploads.json +++ b/public/language/zh-CN/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "帖子", "allow-files": "允许用户上传普通文件", "private": "使上传的文件私有化", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "自定义文件扩展名", + "private-uploads-extensions-help": "在此处输入以逗号分隔的文件扩展名列表 (例如 pdf,xls,doc )并将其用于自定义。为空则表示允许所有扩展名。", "max-image-width": "缩小图片到指定宽度(单位像素)", "max-image-width-help": "(像素单位,默认 760 px,设置为0以禁用)", "resize-image-quality": "调整图像大小时使用的质量", diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index e046c3d947..2bfea5f85e 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -4,8 +4,8 @@ "invite": "来自%1的邀请", "greeting_no_name": "您好", "greeting_with_name": "%1,您好", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "请验证你的电子邮箱", + "email.verify.text1": "你的电子邮箱地址已经成功更改!", "welcome.text1": "感谢您注册 %1 帐户!", "welcome.text2": "我们需要在校验您注册时填写的电子邮箱地址后,才能激活您的帐户。", "welcome.text3": "管理员接受了您的注册请求,请用您的用户名和密码登陆。", diff --git a/public/language/zh-CN/groups.json b/public/language/zh-CN/groups.json index 8e29806e64..73e54c493d 100644 --- a/public/language/zh-CN/groups.json +++ b/public/language/zh-CN/groups.json @@ -28,7 +28,7 @@ "details.grant": "授予/取消管理权", "details.kick": "踢出群组", "details.kick_confirm": "您确定要将此成员从群组中移除吗?", - "details.add-member": "Add Member", + "details.add-member": "添加成员", "details.owner_options": "群组管理", "details.group_name": "群组名", "details.member_count": "群组成员数", diff --git a/public/language/zh-CN/modules.json b/public/language/zh-CN/modules.json index 503f790fc8..d3bcde6326 100644 --- a/public/language/zh-CN/modules.json +++ b/public/language/zh-CN/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "您确定删除此消息吗?", "chat.retrieving-users": "查找用户", "chat.manage-room": "管理聊天室", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "在这里查找更多用户。选中之后添加到聊天中,新用户在加入聊天之前看不到聊天消息。只有聊天室所有者()可以从聊天室中移除用户。", "chat.confirm-chat-with-dnd-user": "该用户已将其状态设置为 DnD(请勿打扰)。 您仍希望与其聊天吗?", "chat.rename-room": "重命名房间", "chat.rename-placeholder": "在这里输入房间名字", @@ -33,7 +33,7 @@ "chat.in-room": "在此房间", "chat.kick": "踢出", "chat.show-ip": "显示 IP", - "chat.owner": "Room Owner", + "chat.owner": "房间所有者", "composer.compose": "编写帮助", "composer.show_preview": "显示预览", "composer.hide_preview": "隐藏预览", diff --git a/public/language/zh-CN/pages.json b/public/language/zh-CN/pages.json index ae46d1680c..bf367ccdb0 100644 --- a/public/language/zh-CN/pages.json +++ b/public/language/zh-CN/pages.json @@ -6,10 +6,10 @@ "popular-month": "当月热门话题", "popular-alltime": "热门主题", "recent": "最新主题", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "今日得票数最高的主题", + "top-week": "本周得票数最高的主题", + "top-month": "本月票数最高的主题", + "top-alltime": "票数最高的主题", "moderator-tools": "版主工具", "flagged-content": "举报管理", "ip-blacklist": "IP 黑名单", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 1d8ba17e48..5544cd15a4 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -31,8 +31,8 @@ "following": "关注", "blocks": "屏蔽", "block_toggle": "屏蔽该用户", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "屏蔽用户", + "unblock_user": "取消屏蔽", "aboutme": "关于我", "signature": "签名档", "birthday": "生日", @@ -109,9 +109,9 @@ "no-sound": "无提示音", "upvote-notif-freq": "帖子被顶的通知频率", "upvote-notif-freq.all": "每一次被顶都通知我", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "首次顶贴", "upvote-notif-freq.everyTen": "每10次被顶通知我一次", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "当被顶的数目为1, 5, 10, 25, 50, 100, 150, 200...时通知我", "upvote-notif-freq.logarithmic": "当被顶的数目为10, 100, 1000...时通知我", "upvote-notif-freq.disabled": "任何时候都不要通知我", "browsing": "浏览设置", From c7d6cacd9849ce29e332048148186a42acea74f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 26 Jul 2018 10:52:06 -0400 Subject: [PATCH 057/310] closes #6658 --- src/routes/feeds.js | 38 ++++++++++++++++++++++++++++++++------ test/controllers.js | 9 +++++++++ test/feeds.js | 1 + 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index f843e08e7a..eb2e2e051c 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -26,6 +26,7 @@ var terms = { module.exports = function (app, middleware) { app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic); app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory); + app.get('/topics.rss', middleware.maintenanceMode, generateForTopics); app.get('/recent.rss', middleware.maintenanceMode, generateForRecent); app.get('/top.rss', middleware.maintenanceMode, generateForTop); app.get('/top/:term.rss', middleware.maintenanceMode, generateForTop); @@ -191,6 +192,31 @@ function generateForCategory(req, res, next) { ], next); } +function generateForTopics(req, res, next) { + if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) { + return controllers404.send404(req, res); + } + + async.waterfall([ + function (next) { + if (req.query.token && req.query.uid) { + db.getObjectField('user:' + req.query.uid, 'rss_token', next); + } else { + next(null, null); + } + }, + function (token, next) { + sendTopicsFeed({ + uid: token && token === req.query.token ? req.query.uid : req.uid, + title: 'Most recently created topics', + description: 'A list of topics that have been created recently', + feed_url: '/topics.rss', + useMainPost: true, + }, 'topics:tid', req, res, next); + }, + ], next); +} + function generateForRecent(req, res, next) { if (parseInt(meta.config['feeds:disableRSS'], 10) === 1) { return controllers404.send404(req, res); @@ -205,7 +231,7 @@ function generateForRecent(req, res, next) { } }, function (token, next) { - generateForTopics({ + sendTopicsFeed({ uid: token && token === req.query.token ? req.query.uid : req.uid, title: 'Recently Active Topics', description: 'A list of topics that have been active within the past 24 hours', @@ -297,7 +323,7 @@ function generateForPopular(req, res, next) { ], next); } -function generateForTopics(options, set, req, res, next) { +function sendTopicsFeed(options, set, req, res, next) { var start = options.hasOwnProperty('start') ? options.start : 0; var stop = options.hasOwnProperty('stop') ? options.stop : 19; async.waterfall([ @@ -326,14 +352,14 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) { feed.pubDate = new Date(parseInt(feedTopics[0].lastposttime, 10)).toUTCString(); } - async.each(feedTopics, function (topicData, next) { + async.eachSeries(feedTopics, function (topicData, next) { var feedItem = { title: utils.stripHTMLTags(topicData.title, utils.tags), url: nconf.get('url') + '/topic/' + topicData.slug, date: new Date(parseInt(topicData.lastposttime, 10)).toUTCString(), }; - if (topicData.teaser && topicData.teaser.user) { + if (topicData.teaser && topicData.teaser.user && !feedOptions.useMainPost) { feedItem.description = topicData.teaser.content; feedItem.author = topicData.teaser.user.username; feed.item(feedItem); @@ -464,7 +490,7 @@ function generateForUserTopics(req, res, callback) { user.getUserFields(uid, ['uid', 'username'], next); }, function (userData, next) { - generateForTopics({ + sendTopicsFeed({ uid: req.uid, title: 'Topics by ' + userData.username, description: 'A list of topics that are posted by ' + userData.username, @@ -484,7 +510,7 @@ function generateForTag(req, res, next) { var topicsPerPage = meta.config.topicsPerPage || 20; var start = Math.max(0, (page - 1) * topicsPerPage); var stop = start + topicsPerPage - 1; - generateForTopics({ + sendTopicsFeed({ uid: req.uid, title: 'Topics tagged with ' + tag, description: 'A list of topics that have been tagged with ' + tag, diff --git a/test/controllers.js b/test/controllers.js index 65ec3c6b91..a61594c47d 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -442,6 +442,15 @@ describe('Controllers', function () { }); }); + it('should load topics rss feed', function (done) { + request(nconf.get('url') + '/topics.rss', function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + it('should load recent rss feed', function (done) { request(nconf.get('url') + '/recent.rss', function (err, res, body) { assert.ifError(err); diff --git a/test/feeds.js b/test/feeds.js index 2d8156404c..2155ba5793 100644 --- a/test/feeds.js +++ b/test/feeds.js @@ -52,6 +52,7 @@ describe('feeds', function () { var feedUrls = [ nconf.get('url') + '/topic/' + tid + '.rss', nconf.get('url') + '/category/' + cid + '.rss', + nconf.get('url') + '/topics.rss', nconf.get('url') + '/recent.rss', nconf.get('url') + '/top.rss', nconf.get('url') + '/popular.rss', From 48197e2d25dbbe4304bdda0ac8bc9d28b8e1c5eb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 11:02:38 -0400 Subject: [PATCH 058/310] this upgrade script was written in 2018, not 2017, heh --- src/upgrades/1.10.0/hash_recent_ip_addresses.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrades/1.10.0/hash_recent_ip_addresses.js b/src/upgrades/1.10.0/hash_recent_ip_addresses.js index 9e13db0252..a2d7d1a99e 100644 --- a/src/upgrades/1.10.0/hash_recent_ip_addresses.js +++ b/src/upgrades/1.10.0/hash_recent_ip_addresses.js @@ -9,7 +9,7 @@ var nconf = require('nconf'); module.exports = { name: 'Hash all IP addresses stored in Recent IPs zset', - timestamp: Date.UTC(2017, 5, 22), + timestamp: Date.UTC(2018, 5, 22), method: function (callback) { const progress = this.progress; var hashed = /[a-f0-9]{32}/; From 5243ee559adee7d305a74067ff0bf925a675381c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 13:00:40 -0400 Subject: [PATCH 059/310] set initial focus on register page --- public/src/client/register.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/src/client/register.js b/public/src/client/register.js index 0423f543d3..7b61ca11d9 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -113,6 +113,9 @@ define('forum/register', ['translator', 'zxcvbn'], function (translator, zxcvbn) }); }); }); + + // Set initial focus + $('#email').focus(); }; function validateEmail(email, callback) { From 7dfe953526445e75dd30fe33cdde3dc7119cdae9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 14:36:25 -0400 Subject: [PATCH 060/310] closes #6672 --- public/language/en-GB/global.json | 1 + src/user/data.js | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/language/en-GB/global.json b/public/language/en-GB/global.json index 14d9b13421..9f5ad80e7a 100644 --- a/public/language/en-GB/global.json +++ b/public/language/en-GB/global.json @@ -108,6 +108,7 @@ "guest": "Guest", "guests": "Guests", + "former_user": "A Former User", "updated.title": "Forum Updated", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", diff --git a/src/user/data.js b/src/user/data.js index 05ebc2f9b2..dc851dc8c4 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -119,6 +119,11 @@ module.exports = function (User) { return memo; }, {}); var users = uids.map(function (uid) { + const returnPayload = usersData[ref[uid]]; + if (uid > 0 && !returnPayload.uid) { + returnPayload.oldUid = parseInt(uid, 10); + } + return usersData[ref[uid]]; }); return users; @@ -144,7 +149,7 @@ module.exports = function (User) { if (!parseInt(user.uid, 10)) { user.uid = 0; - user.username = '[[global:guest]]'; + user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]'; user.userslug = ''; user.picture = User.getDefaultAvatar(); user['icon:text'] = '?'; From 41d1ebf02ea92be78def943a72215e78eeeabfb6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 14:36:36 -0400 Subject: [PATCH 061/310] bump persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index a3cdb102b2..93f63cf3a8 100644 --- a/install/package.json +++ b/install/package.json @@ -75,7 +75,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.24", + "nodebb-theme-persona": "9.0.25", "nodebb-theme-slick": "1.2.9", "nodebb-theme-vanilla": "10.1.0", "nodebb-widget-essentials": "4.0.7", From ea2bd33bfa10564591f2d8ca69bd5cd7d252ee1d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 15:00:49 -0400 Subject: [PATCH 062/310] fixes #6608, restored template values in widget containers --- public/src/admin/extend/widgets.js | 2 +- src/views/admin/extend/widgets.tpl | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 15414207c0..1139b8b236 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -149,7 +149,7 @@ define('admin/extend/widgets', ['jqueryui'], function () { .addClass(btn.attr('data-class')); container.attr('data-container-html', container.attr('data-container-html') - .replace(/class="[a-zA-Z0-9-\s]+"/, 'class="' + container[0].className.replace(' pointer ui-draggable', '') + '"')); + .replace(/class="[a-zA-Z0-9-\s]+"/, 'class="' + container[0].className.replace(' pointer ui-draggable ui-draggable-handle', '') + '"')); }); } diff --git a/src/views/admin/extend/widgets.tpl b/src/views/admin/extend/widgets.tpl index 9d02b2fb81..3d984516c1 100644 --- a/src/views/admin/extend/widgets.tpl +++ b/src/views/admin/extend/widgets.tpl @@ -85,18 +85,18 @@
[[admin/extend/widgets:containers.none]]
-
+
[[admin/extend/widgets:container.well]]
-
+
[[admin/extend/widgets:container.jumbotron]]
-
+
[[admin/extend/widgets:container.panel]]
-
+
[[admin/extend/widgets:container.panel-header]]
@@ -113,7 +113,7 @@
-
+
[[admin/extend/widgets:container.alert]]
From 4f8815eb78a45fe9d26684398baff50fc90c6752 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 26 Jul 2018 16:38:36 -0400 Subject: [PATCH 063/310] closes #6646 --- src/controllers/authentication.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 643b898843..d1a4ad9bca 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -12,7 +12,6 @@ var meta = require('../meta'); var user = require('../user'); var plugins = require('../plugins'); var utils = require('../utils'); -var Password = require('../password'); var translator = require('../translator'); var helpers = require('./helpers'); @@ -398,9 +397,6 @@ authenticationController.localLogin = function (req, username, password, next) { uid = _uid; async.parallel({ - userData: function (next) { - db.getObjectFields('user:' + uid, ['password', 'passwordExpiry'], next); - }, isAdminOrGlobalMod: function (next) { user.isAdminOrGlobalMod(uid, next); }, @@ -410,9 +406,10 @@ authenticationController.localLogin = function (req, username, password, next) { }, next); }, function (result, next) { - userData = result.userData; - userData.uid = uid; - userData.isAdminOrGlobalMod = result.isAdminOrGlobalMod; + userData = { + uid: uid, + isAdminOrGlobalMod: result.isAdminOrGlobalMod, + }; if (!result.isAdminOrGlobalMod && parseInt(meta.config.allowLocalLogin, 10) === 0) { return next(new Error('[[error:local-login-disabled]]')); @@ -425,7 +422,7 @@ authenticationController.localLogin = function (req, username, password, next) { user.auth.logAttempt(uid, req.ip, next); }, function (next) { - Password.compare(password, userData.password, next); + user.isPasswordCorrect(uid, password, next); }, function (passwordMatch, next) { if (!passwordMatch) { From b3f5901a96d0fb2e0727a5c813e7a1566b7f0c49 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 27 Jul 2018 09:29:35 +0000 Subject: [PATCH 064/310] Latest translations and fallbacks --- public/language/pl/user.json | 2 +- public/language/sr/email.json | 4 ++-- public/language/sr/groups.json | 2 +- public/language/sr/modules.json | 4 ++-- public/language/sr/pages.json | 8 ++++---- public/language/sr/user.json | 8 ++++---- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 1af717fac6..25fb1c626e 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -31,7 +31,7 @@ "following": "Obserwowani", "blocks": "Blokady", "block_toggle": "Przełącz blokadę", - "block_user": "Block User", + "block_user": "Blokuj użytkownika", "unblock_user": "Unblock User", "aboutme": "O mnie", "signature": "Sygnatura", diff --git a/public/language/sr/email.json b/public/language/sr/email.json index cd1c7dfda1..8fb31f29f3 100644 --- a/public/language/sr/email.json +++ b/public/language/sr/email.json @@ -4,8 +4,8 @@ "invite": "Позивница од %1", "greeting_no_name": "Здраво", "greeting_with_name": "Здраво %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Потврдите вашу е-пошту", + "email.verify.text1": "Ваша адреса е-поште је промењена!", "welcome.text1": "Хвала што сте се регистровали на %1!", "welcome.text2": "Да бисте у потпуности активирали ваш налог, потребно је да проверимо да ли стварно поседујете адресу е-поште којом сте се регистровали. ", "welcome.text3": "Администратор је прихватио вашу регистрацију. Можете се пријавити са вашим именом и лозинком.", diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json index 6513e60c65..16091c5ff8 100644 --- a/public/language/sr/groups.json +++ b/public/language/sr/groups.json @@ -28,7 +28,7 @@ "details.grant": "Одобри/Поништи власништво", "details.kick": "Избаци", "details.kick_confirm": "Да ли сте сигурни да желите да уклоните овог члана из групе?", - "details.add-member": "Add Member", + "details.add-member": "Додај члана", "details.owner_options": "Администрација групе", "details.group_name": "Име групе", "details.member_count": "Број чланова", diff --git a/public/language/sr/modules.json b/public/language/sr/modules.json index 794b71838a..cdd9b44ff9 100644 --- a/public/language/sr/modules.json +++ b/public/language/sr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Да ли сте сигурни да желите да избришете ову поруку?", "chat.retrieving-users": "Преузимање корисника...", "chat.manage-room": "Управљај собама за ћаскање", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Потражите кориснике овде. Када буде изабран, корисник ће бити додан у ћаскање. Нови корисник неће бити у могућности да види поруке написане пре него што је додан у преписку. Само власници соба () могу уклонити кориснике из соба за ћаскање.", "chat.confirm-chat-with-dnd-user": "Овај корисник је поставио свој статус на \"Не узнемиравај\". Да ли и даље желите да ћаскате са њим?", "chat.rename-room": "Преименуј собу", "chat.rename-placeholder": "Унесите назив собе овде", @@ -33,7 +33,7 @@ "chat.in-room": "У овој соби", "chat.kick": "Избаци", "chat.show-ip": "Прикажи IP", - "chat.owner": "Room Owner", + "chat.owner": "Власник собе", "composer.compose": "Писање поруке", "composer.show_preview": "Прикажи преглед", "composer.hide_preview": "Сакриј преглед", diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index a4840b4e20..347dd05a94 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -6,10 +6,10 @@ "popular-month": "Популарне теме овог месеца", "popular-alltime": "Популарне теме свих времена", "recent": "Недавне теме", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Најгласаније теме данас", + "top-week": "Најгласаније теме ове седмице", + "top-month": "Најгласаније теме овог месеца", + "top-alltime": "Најгласаније теме", "moderator-tools": "Алати модератора", "flagged-content": "Садржај означен заставицом", "ip-blacklist": "Црна листа IP адреса", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index c4ebd2bb37..26b4a1d1af 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -31,8 +31,8 @@ "following": "Праћења", "blocks": "Блокирања", "block_toggle": "Блокирај/одблокирај", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Блокирај корисника", + "unblock_user": "Одблокирај корисника", "aboutme": "О мени", "signature": "Потпис", "birthday": "Рођендан", @@ -109,9 +109,9 @@ "no-sound": "Без звука", "upvote-notif-freq": "Учесталост обавештења о гласовима", "upvote-notif-freq.all": "На сваки глас", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "Прво по поруци", "upvote-notif-freq.everyTen": "На сваких десет гласова", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "На 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", "upvote-notif-freq.disabled": "Онемогућено", "browsing": "Подешавање прегледања", From b6a5419ca11c616c1837420264473b9d131987b1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 Jul 2018 11:54:23 -0400 Subject: [PATCH 065/310] closes #6674 --- src/controllers/authentication.js | 7 ++----- src/socket.io/user.js | 14 +++----------- src/socket.io/user/profile.js | 30 +++++++++++++++++------------- src/user/auth.js | 1 + src/user/password.js | 12 +++++++----- src/user/profile.js | 4 ++-- 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index d1a4ad9bca..739632b6c4 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -419,16 +419,13 @@ authenticationController.localLogin = function (req, username, password, next) { return getBanInfo(uid, next); } - user.auth.logAttempt(uid, req.ip, next); - }, - function (next) { - user.isPasswordCorrect(uid, password, next); + user.isPasswordCorrect(uid, password, req.ip, next); }, function (passwordMatch, next) { if (!passwordMatch) { return next(new Error('[[error:invalid-login-credentials]]')); } - user.auth.clearLoginAttempts(uid); + next(null, userData, '[[success:authentication-successful]]'); }, ], next); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 5401ccca44..2df4cfa612 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -37,8 +37,8 @@ SocketUser.deleteAccount = function (socket, data, callback) { async.waterfall([ function (next) { - user.isPasswordCorrect(socket.uid, data.password, function (err, ok) { - next(err || !ok ? new Error('[[error:invalid-password]]') : undefined); + user.isPasswordCorrect(socket.uid, data.password, socket.ip, function (err, ok) { + next(err || (!ok ? new Error('[[error:invalid-password]]') : undefined)); }); }, function (next) { @@ -61,15 +61,7 @@ SocketUser.deleteAccount = function (socket, data, callback) { }); next(); }, - ], function (err) { - if (err) { - return setTimeout(function () { - callback(err); - }, 2500); - } - - callback(); - }); + ], callback); }; SocketUser.emailExists = function (socket, data, callback) { diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 6cf76be9ee..036a22c366 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -15,7 +15,7 @@ module.exports = function (SocketUser) { async.waterfall([ function (next) { - isPrivilegedOrSelfAndPasswordMatch(socket.uid, data, next); + isPrivilegedOrSelfAndPasswordMatch(socket, data, next); }, function (next) { SocketUser.updateProfile(socket, data, next); @@ -72,26 +72,19 @@ module.exports = function (SocketUser) { ], callback); }; - function isPrivilegedOrSelfAndPasswordMatch(uid, data, callback) { + function isPrivilegedOrSelfAndPasswordMatch(socket, data, callback) { + const uid = socket.uid; + const isSelf = parseInt(uid, 10) === parseInt(data.uid, 10); + async.waterfall([ function (next) { async.parallel({ isAdmin: async.apply(user.isAdministrator, uid), isTargetAdmin: async.apply(user.isAdministrator, data.uid), isGlobalMod: async.apply(user.isGlobalModerator, uid), - hasPassword: async.apply(user.hasPassword, data.uid), - passwordMatch: function (next) { - if (data.password) { - user.isPasswordCorrect(data.uid, data.password, next); - } else { - next(null, false); - } - }, }, next); }, function (results, next) { - var isSelf = parseInt(uid, 10) === parseInt(data.uid, 10); - if (results.isTargetAdmin && !results.isAdmin) { return next(new Error('[[error:no-privileges]]')); } @@ -100,6 +93,17 @@ module.exports = function (SocketUser) { return next(new Error('[[error:no-privileges]]')); } + async.parallel({ + hasPassword: async.apply(user.hasPassword, data.uid), + passwordMatch: function (next) { + if (data.password) { + user.isPasswordCorrect(data.uid, data.password, socket.ip, next); + } else { + next(null, false); + } + }, + }, next); + }, function (results, next) { if (isSelf && results.hasPassword && !results.passwordMatch) { return next(new Error('[[error:invalid-password]]')); } @@ -119,7 +123,7 @@ module.exports = function (SocketUser) { } async.waterfall([ function (next) { - user.changePassword(socket.uid, data, next); + user.changePassword(socket.uid, Object.assign(data, { ip: socket.ip }), next); }, function (next) { events.log({ diff --git a/src/user/auth.js b/src/user/auth.js index 195e14ce50..ae4d8ab4f8 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -13,6 +13,7 @@ module.exports = function (User) { User.auth = {}; User.auth.logAttempt = function (uid, ip, callback) { + console.log('attempt logged'); if (!parseInt(uid, 10)) { return setImmediate(callback); } diff --git a/src/user/password.js b/src/user/password.js index bf39d029d0..b5b884774d 100644 --- a/src/user/password.js +++ b/src/user/password.js @@ -15,7 +15,7 @@ module.exports = function (User) { Password.hash(nconf.get('bcrypt_rounds') || 12, password, callback); }; - User.isPasswordCorrect = function (uid, password, callback) { + User.isPasswordCorrect = function (uid, password, ip, callback) { password = password || ''; var hashedPassword; async.waterfall([ @@ -30,6 +30,7 @@ module.exports = function (User) { User.isPasswordValid(password, 0, next); }, + async.apply(User.auth.logAttempt, uid, ip), function (next) { Password.compare(password, hashedPassword, next); }, @@ -38,10 +39,11 @@ module.exports = function (User) { return callback(err); } - // Delay return for incorrect current password - setTimeout(function () { - callback(null, ok); - }, ok ? 0 : 2500); + if (ok) { + User.auth.clearLoginAttempts(uid); + } + + callback(null, ok); }); }; diff --git a/src/user/profile.js b/src/user/profile.js index 2849fbde1a..cc55728d93 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -324,12 +324,12 @@ module.exports = function (User) { if (parseInt(uid, 10) !== parseInt(data.uid, 10)) { User.isAdministrator(uid, next); } else { - User.isPasswordCorrect(uid, data.currentPassword, next); + User.isPasswordCorrect(uid, data.currentPassword, data.ip, next); } }, function (isAdminOrPasswordMatch, next) { if (!isAdminOrPasswordMatch) { - return next(new Error('[[error:change_password_error_wrong_current]]')); + return next(new Error('[[user:change_password_error_wrong_current]]')); } User.hashPassword(data.newPassword, next); From 786af5fbb354c147d37872d92f272813b92ccef9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 Jul 2018 11:57:41 -0400 Subject: [PATCH 066/310] derp --- src/user/auth.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/user/auth.js b/src/user/auth.js index ae4d8ab4f8..195e14ce50 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -13,7 +13,6 @@ module.exports = function (User) { User.auth = {}; User.auth.logAttempt = function (uid, ip, callback) { - console.log('attempt logged'); if (!parseInt(uid, 10)) { return setImmediate(callback); } From 3c6c0ed7a11c82bad75223230651a4c2a2e0657d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 27 Jul 2018 12:34:51 -0400 Subject: [PATCH 067/310] restoring passwordExpiry for use in continueLogin, fixed tests, hopefully --- src/controllers/authentication.js | 5 +++-- src/user/password.js | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 739632b6c4..5dd4d62efe 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -397,6 +397,7 @@ authenticationController.localLogin = function (req, username, password, next) { uid = _uid; async.parallel({ + userData: async.apply(db.getObjectFields, 'user:' + uid, ['passwordExpiry']), isAdminOrGlobalMod: function (next) { user.isAdminOrGlobalMod(uid, next); }, @@ -406,10 +407,10 @@ authenticationController.localLogin = function (req, username, password, next) { }, next); }, function (result, next) { - userData = { + userData = Object.assign(result.userData, { uid: uid, isAdminOrGlobalMod: result.isAdminOrGlobalMod, - }; + }); if (!result.isAdminOrGlobalMod && parseInt(meta.config.allowLocalLogin, 10) === 0) { return next(new Error('[[error:local-login-disabled]]')); diff --git a/src/user/password.js b/src/user/password.js index b5b884774d..78dc61cec4 100644 --- a/src/user/password.js +++ b/src/user/password.js @@ -24,8 +24,11 @@ module.exports = function (User) { }, function (_hashedPassword, next) { hashedPassword = _hashedPassword; - if (!hashedPassword) { + if (uid && !hashedPassword) { return callback(null, true); + } else if (!hashedPassword) { + // Non-existant user, submit fake hash for comparison + hashedPassword = ''; } User.isPasswordValid(password, 0, next); From 4200cff47cb7adc046ea00911f1ca3723be03d8e Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 12:48:09 -0400 Subject: [PATCH 068/310] closes #6662 --- src/messaging/create.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/messaging/create.js b/src/messaging/create.js index bcee2f4f5d..7380ff6f89 100644 --- a/src/messaging/create.js +++ b/src/messaging/create.js @@ -84,7 +84,6 @@ module.exports = function (Messaging) { async.apply(Messaging.addRoomToUsers, data.roomId, uids, data.timestamp), async.apply(Messaging.addMessageToUsers, data.roomId, uids, mid, data.timestamp), async.apply(Messaging.markUnread, uids, data.roomId), - async.apply(Messaging.addUsersToRoom, data.uid, [data.uid], data.roomId), ], next); }, function (results, next) { From 79ffae608e92f19391344467df63b6a3e44653aa Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 12:58:01 -0400 Subject: [PATCH 069/310] closes #6675 --- src/socket.io/user/profile.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 036a22c366..14c4d5fbea 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -205,24 +205,29 @@ module.exports = function (SocketUser) { }; SocketUser.toggleBlock = function (socket, data, callback) { - let current; + let isBlocked; async.waterfall([ function (next) { - user.blocks.can(socket.uid, data.blockerUid, data.blockeeUid, next); + async.parallel({ + can: function (next) { + user.blocks.can(socket.uid, data.blockerUid, data.blockeeUid, next); + }, + is: function (next) { + user.blocks.is(data.blockeeUid, data.blockerUid, next); + } + }, next); }, - function (can, next) { - if (!can) { + function (results, next) { + isBlocked = results.is; + if (!results.can && !isBlocked) { return next(new Error('[[error:cannot-block-privileged]]')); } - user.blocks.is(data.blockeeUid, data.blockerUid, next); - }, - function (is, next) { - current = is; - user.blocks[is ? 'remove' : 'add'](data.blockeeUid, data.blockerUid, next); + + user.blocks[isBlocked ? 'remove' : 'add'](data.blockeeUid, data.blockerUid, next); }, ], function (err) { - callback(err, !current); + callback(err, !isBlocked); }); }; }; From 546b13b897f77e7f1ca113ac4836602512daeed0 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 13:10:52 -0400 Subject: [PATCH 070/310] fix lint and tests --- src/socket.io/user/profile.js | 2 +- test/user.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 14c4d5fbea..857ac4ddf8 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -215,7 +215,7 @@ module.exports = function (SocketUser) { }, is: function (next) { user.blocks.is(data.blockeeUid, data.blockerUid, next); - } + }, }, next); }, function (results, next) { diff --git a/test/user.js b/test/user.js index 96b47921c6..c0d7cb9e18 100644 --- a/test/user.js +++ b/test/user.js @@ -677,7 +677,7 @@ describe('User', function () { assert.ifError(err); socketUser.changePassword({ uid: uid }, { uid: uid, newPassword: '654321', currentPassword: '123456' }, function (err) { assert.ifError(err); - User.isPasswordCorrect(uid, '654321', function (err, correct) { + User.isPasswordCorrect(uid, '654321', '127.0.0.1', function (err, correct) { assert.ifError(err); assert(correct); done(); From bcef32c5af71f6543d14c055f1167b8f9c5ea960 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 13:38:37 -0400 Subject: [PATCH 071/310] closes #6645 --- src/topics/teaser.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/topics/teaser.js b/src/topics/teaser.js index 508bd51bc8..fddc32052d 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -57,7 +57,12 @@ module.exports = function (Topics) { function (next) { posts.getPostsFields(teaserPids, ['pid', 'uid', 'timestamp', 'tid', 'content'], next); }, - async.apply(user.blocks.filter, uid), + function (_postData, next) { + _postData = _postData.filter(function (post) { + return post && parseInt(post.pid, 10); + }) + user.blocks.filter(uid, _postData, next); + }, function (_postData, next) { postData = _postData; var uids = _.uniq(postData.map(function (post) { From e7bd0cea7493ce62ce76021afd6045236e3fe080 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 14:27:23 -0400 Subject: [PATCH 072/310] fix lint --- src/topics/teaser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/teaser.js b/src/topics/teaser.js index fddc32052d..57721cd916 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -60,7 +60,7 @@ module.exports = function (Topics) { function (_postData, next) { _postData = _postData.filter(function (post) { return post && parseInt(post.pid, 10); - }) + }); user.blocks.filter(uid, _postData, next); }, function (_postData, next) { From 976b85ccaabb737b608eb60f889136e5ec27036f Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 27 Jul 2018 15:24:14 -0400 Subject: [PATCH 073/310] closes #6676 --- public/src/client/topic/merge.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/merge.js b/public/src/client/topic/merge.js index f250e19f50..fd4eb592ed 100644 --- a/public/src/client/topic/merge.js +++ b/public/src/client/topic/merge.js @@ -25,7 +25,7 @@ define('forum/topic/merge', function () { modal.find('.close,#merge_topics_cancel').on('click', closeModal); - $('[component="category"]').on('click', '[component="category/topic"] a', onTopicClicked); + $('#content').on('click', '[component="category"] [component="category/topic"] a', onTopicClicked); showTopicsSelected(); @@ -101,7 +101,7 @@ define('forum/topic/merge', function () { modal = null; } selectedTids = {}; - $('[component="category"]').off('click', '[component="category/topic"] a', onTopicClicked); + $('#content').off('click', '[component="category"] [component="category/topic"] a', onTopicClicked); } return Merge; From 4059a49c901066d14a8083c62c83a93c215a317e Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 28 Jul 2018 09:28:47 +0000 Subject: [PATCH 074/310] Latest translations and fallbacks --- public/language/fa-IR/modules.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/public/language/fa-IR/modules.json b/public/language/fa-IR/modules.json index 9a88e5346f..e7079256b8 100644 --- a/public/language/fa-IR/modules.json +++ b/public/language/fa-IR/modules.json @@ -1,5 +1,5 @@ { - "chat.chatting_with": "Chat with", + "chat.chatting_with": "چت با", "chat.placeholder": "پیام گفتگو را اینجا بنویسید، دکمه Enter را بزنید تا فرستاده شود.", "chat.send": "ارسال", "chat.no_active": "شما هیچ گفتگوی فعالی ندارید.", @@ -12,7 +12,7 @@ "chat.recent-chats": "گفتگو های اخیر", "chat.contacts": "تماس‌ها", "chat.message-history": "تاریخچه پیام‌ها", - "chat.options": "Chat options", + "chat.options": "تنظیمات چت", "chat.pop-out": "پاپ آپ گفتگو", "chat.minimize": "کوچک کردن", "chat.maximize": "تمام صفحه", @@ -21,19 +21,19 @@ "chat.three_months": "3 ماه", "chat.delete_message_confirm": "آیا مطمئن هستید که می خواهید این پیام را حذف کنید؟", "chat.retrieving-users": "Retrieving users...", - "chat.manage-room": "Manage Chat Room", + "chat.manage-room": "مدیریت چت روم", "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "این کاربر وضعیت خود را روی حالت مزاحم نشوید قرار داده است. آیا همچنان می خواهید با او چت کنید؟", - "chat.rename-room": "Rename Room", - "chat.rename-placeholder": "Enter your room name here", - "chat.rename-help": "The room name set here will be viewable by all participants in the room.", - "chat.leave": "Leave Chat", - "chat.leave-prompt": "Are you sure you wish to leave this chat?", - "chat.leave-help": "Leaving this chat will remove you from future correspondence in this chat. If you are re-added in the future, you will not see any chat history from prior to your re-joining.", - "chat.in-room": "In this room", - "chat.kick": "Kick", - "chat.show-ip": "Show IP", - "chat.owner": "Room Owner", + "chat.rename-room": "تعویض اسم چت روم", + "chat.rename-placeholder": "اسم چت روم را اینجا وارد کنید", + "chat.rename-help": "اسم چت روم برای همه کاربران چت روم قابل رویت خواهد بود.", + "chat.leave": "ترک چت روم", + "chat.leave-prompt": "آیا شما مطمئن هستید که می خواهید چت روم را ترک کنید؟", + "chat.leave-help": "ترک این چت روم باعث از دست دادن ارتباط شما می شود. اگر شما بعدا به چت روم اضافه بشوید، قادر به مشاهده تاریخچه پیام ها نخواهید بود.", + "chat.in-room": "در این چت روم", + "chat.kick": "اخراج", + "chat.show-ip": "نشان دادن IP", + "chat.owner": "مدیر چت روم", "composer.compose": "ارسال", "composer.show_preview": "نمایش پیش‌نمایش", "composer.hide_preview": "مخفی کردن پیش‌نمایش", From 035c04212d2221a4ae001a3df78589fb87bfe6bb Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 31 Jul 2018 09:29:17 +0000 Subject: [PATCH 075/310] Latest translations and fallbacks --- public/language/fa-IR/email.json | 4 ++-- public/language/fa-IR/error.json | 20 +++++++++---------- public/language/fa-IR/flags.json | 2 +- public/language/fa-IR/global.json | 6 +++--- public/language/fa-IR/groups.json | 2 +- public/language/fa-IR/notifications.json | 2 +- public/language/fa-IR/register.json | 6 +++--- public/language/fa-IR/reset_password.json | 2 +- public/language/fa-IR/search.json | 6 +++--- public/language/fa-IR/topic.json | 16 +++++++-------- public/language/fa-IR/user.json | 10 +++++----- .../language/pl/admin/settings/advanced.json | 6 +++--- .../language/pl/admin/settings/uploads.json | 4 ++-- public/language/pl/email.json | 4 ++-- public/language/pl/groups.json | 2 +- public/language/pl/modules.json | 4 ++-- public/language/pl/pages.json | 8 ++++---- public/language/pl/user.json | 6 +++--- 18 files changed, 55 insertions(+), 55 deletions(-) diff --git a/public/language/fa-IR/email.json b/public/language/fa-IR/email.json index 223644dce4..638f8a699e 100644 --- a/public/language/fa-IR/email.json +++ b/public/language/fa-IR/email.json @@ -4,8 +4,8 @@ "invite": "دعوتنامه از %1", "greeting_no_name": "سلام", "greeting_with_name": "سلام %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "لطفا ایمیل خود را تأیید کنید", + "email.verify.text1": "آدرس ایمیل شما عوض شده است !", "welcome.text1": "متشکریم بابت ثبت نام در %1!", "welcome.text2": "برای فعال کردن کامل اکانت شما، ما نیاز داریم تا اطمینان حاصل کنیم که شما مالک ایمیلی که با ان ثبت نام کردید هستید.", "welcome.text3": "ِک مدیر درخواست ثبت نام شما را قبول کرده. اکنون میتوانید با نام کاربری/رمز عبور خود وارد شوید", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index df47e6442f..26d343013e 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -14,7 +14,7 @@ "invalid-title": "عنوان نامعتبر", "invalid-user-data": "داده‌های کاربر نامعتبر است.", "invalid-password": "کلمه عبور نامعتبر است.", - "invalid-login-credentials": "Invalid login credentials", + "invalid-login-credentials": "نام کاربری یا گذرواژه صحیح نیست", "invalid-username-or-password": "لطفا هم نام کاربری و هم کلمه عبور را مشخص کنید", "invalid-search-term": "کلمه جستجو نامعتبر است", "invalid-url": "URL نامعتبر", @@ -124,11 +124,11 @@ "downvoting-disabled": "رأی منفی غیر فعال شده است", "not-enough-reputation-to-downvote": "شما اعتبار کافی برای دادن رأی منفی به این پست را ندارید.", "not-enough-reputation-to-flag": "شما اعتبار کافی برای نشاندار کردن این پست ندارید", - "not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website", - "not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me", - "not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature", - "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture", - "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture", + "not-enough-reputation-min-rep-website": "شما اعتبار لازم برای درج آدرس وبسایت را ندارید", + "not-enough-reputation-min-rep-aboutme": "شما اعتبار لازم برای ویرایش بخش درباره من را ندارید", + "not-enough-reputation-min-rep-signature": "شما اعتبار لازم برای ایجاد امضاء را ندارید", + "not-enough-reputation-min-rep-profile-picture": "شما اعتبار لازم برای اضافه کردن عکس پروفایل را ندارید", + "not-enough-reputation-min-rep-cover-picture": "شما اعتبار لازم برای اضافه کردن عکس کاور را ندارید", "already-flagged": "شما قبلا این پست را گزارش کرده اید", "self-vote": "شما نمی توانید به پست خود رای بدهید", "reload-failed": "NodeBB در هنگام بارگذاری مجدد با یک مشکل مواجه شده است: \"%1\". NodeBB سرویس رسانی به کلاینت های سرویس گیرنده را ادامه خواهد داد، اگرچه شما کاری را قبل از بارگیری مجدد انجام دادید بازگردانی کنید", @@ -148,8 +148,8 @@ "invalid-session": "عدم تطابق جلسه", "invalid-session-text": "به نظر می‌رسد این جلسه برای ورود دیگر فعال نیست و یا با سرور هماهنگ نیست. لطفا این صفحه را رفرش کنید.", "no-topics-selected": "هیچ موضوعی انتخاب نشده است !", - "cant-move-to-same-topic": "Can't move post to same topic!", - "cannot-block-self": "You cannot block yourself!", - "cannot-block-privileged": "You cannot block administrators or global moderators", - "no-connection": "There seems to be a problem with your internet connection" + "cant-move-to-same-topic": "نمی توان پست یک تاپیک را به همان تاپیک انتقال داد !", + "cannot-block-self": "شما نمی توانید خودتان را بلاک کنید!", + "cannot-block-privileged": "شما نمی توانید ادمین ها یا مدیر ها را بلاک کنید", + "no-connection": "به نظر می رسد اینترنت شما مشکل دارد" } \ No newline at end of file diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 96dcba0357..f59bb99dc9 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -18,7 +18,7 @@ "filter-type": "نوع گزارش", "filter-type-all": "تمام محتوا", "filter-type-post": "پست", - "filter-type-user": "User", + "filter-type-user": "کاربر", "filter-state": "وضعیت", "filter-assignee": "UID رسیدگی کننده", "filter-cid": "دسته بندی", diff --git a/public/language/fa-IR/global.json b/public/language/fa-IR/global.json index 52454658a6..f78c02f324 100644 --- a/public/language/fa-IR/global.json +++ b/public/language/fa-IR/global.json @@ -97,7 +97,7 @@ "enter_page_number": "شماره صفحه را وارد کنید", "upload_file": "بارگذاری فایل", "upload": "بارگذاری", - "uploads": "Uploads", + "uploads": "آپلود ها", "allowed-file-types": "فایل قابل قبول اینها هستند %1", "unsaved-changes": "تغییرات شما ذخیره نشده. شما مطمئن هستید که میخواهید از اینجا دور شوید؟", "reconnecting-message": "اتصال شما به %1 به نظر می‌رسد از دست رفته. لطفا صبر کنید ما سعی می‌کنیم که دوباره شما را متصل کنیم.", @@ -107,6 +107,6 @@ "cookies.learn_more": "بیشتر بدانید", "edited": "Edited", "disabled": "Disabled", - "select": "Select", - "user-search-prompt": "Type something here to find users..." + "select": "انتخاب", + "user-search-prompt": "برای پیدا کردن کاربر اینجا چیزی بنویسید..." } \ No newline at end of file diff --git a/public/language/fa-IR/groups.json b/public/language/fa-IR/groups.json index 5f9ceab6e3..cdb0918d0d 100644 --- a/public/language/fa-IR/groups.json +++ b/public/language/fa-IR/groups.json @@ -28,7 +28,7 @@ "details.grant": "اعطاء/خلع مالکیت", "details.kick": "بیرون انداختن", "details.kick_confirm": "آیا شما مطمئن هستید که می خواهید این عضو از گروه را حذف کنید؟", - "details.add-member": "Add Member", + "details.add-member": "اضافه کردن عضو", "details.owner_options": "مدیر گروه", "details.group_name": "نام گروه", "details.member_count": "تعداد اعضا", diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index c0b76b8c80..02fce2b862 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -57,7 +57,7 @@ "notificationType_follow": "هنگامی که کسی شما را دنبال می کند", "notificationType_new-chat": "هنگامی که شما پیام چتی دریافت می کنید", "notificationType_group-invite": "هنگامی که شما دعوتنامه گروه دریافت می کنید", - "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_new-register": "وقتی کسی به صف ثبت نام اضافه می شود", "notificationType_post-queue": "هنگامی که یک پست جدید در صف قرار می گیرد", "notificationType_new-post-flag": "هنگامی که پستی گزارش می شود", "notificationType_new-user-flag": "هنگامی که کاربری گزارش می شود" diff --git a/public/language/fa-IR/register.json b/public/language/fa-IR/register.json index 92b570e017..5c5eb963d2 100644 --- a/public/language/fa-IR/register.json +++ b/public/language/fa-IR/register.json @@ -20,7 +20,7 @@ "registration-added-to-queue": "ثبت نام شما به صف تایید اضافه شد. وقتی توسط یک مدیر تایید شد شما ایمیلی دریافت خواهید کرد.", "interstitial.intro": "ما نیاز به برخی اطلاعات اضافی شما قبل از ایجاد شناسه کاربری داریم.", "interstitial.errors-found": "شما نمی‌توانید ثبت نام خود را تکمیل کنید:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "من با جمع آوری و پرداز اطلاعات شخصی در این وبسایت موافقم.", + "gdpr_agree_email": "من با دریافت ایمیل ها و خلاصه ها از این وبسایت موافقم.", + "gdpr_consent_denied": "شما باید رضایت خود را برای جمع آوری/پردازش اطلاعاتتان و دریافت ایمیل را اعلام کنید." } \ No newline at end of file diff --git a/public/language/fa-IR/reset_password.json b/public/language/fa-IR/reset_password.json index d897e1cb7e..900fd987dc 100644 --- a/public/language/fa-IR/reset_password.json +++ b/public/language/fa-IR/reset_password.json @@ -9,7 +9,7 @@ "repeat_password": "تکرار گذرواژه", "enter_email": "لطفا نشانی رایانامهٔ خود را بنویسید و ما دستورکار بازیابی شناسه‌تان را به این رایانامه می‌فرستیم.", "enter_email_address": "نوشتن نشانی رایانامه", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "password_reset_sent": "ایمیل بازیابی رمز عبور به ایمیل شما ارسال شد. لطفا مد نظر داشته باشید که یک ایمیل در هر دقیقه ارسال می شود.", "invalid_email": "رایانامهٔ نامعتبر / رایانامه وجود ندارد!", "password_too_short": "کلمه عبور وارد شده خیلی کوتاه است، لطفا یک گذر واژه طولانی تر انتخاب کنید.", "passwords_do_not_match": "دو کلمه عبوری که وارد کرده اید مطابقت ندارند.", diff --git a/public/language/fa-IR/search.json b/public/language/fa-IR/search.json index 803498d235..9143652aae 100644 --- a/public/language/fa-IR/search.json +++ b/public/language/fa-IR/search.json @@ -5,9 +5,9 @@ "in": "در", "titles": "عناوین", "titles-posts": "عناوین و پست ها", - "match-words": "Match words", - "all": "All", - "any": "Any", + "match-words": "تطابق کلمات", + "all": "همه", + "any": "هرکدام", "posted-by": "ارسال شده توسط", "in-categories": "در دسته بندی ها", "search-child-categories": "جستجوی زیر دسته ها", diff --git a/public/language/fa-IR/topic.json b/public/language/fa-IR/topic.json index 2c344cf1a8..be9878835e 100644 --- a/public/language/fa-IR/topic.json +++ b/public/language/fa-IR/topic.json @@ -35,7 +35,7 @@ "view-history": "تاریخچه ویرایش", "bookmark_instructions": "برای بازگشت به آخرین پست در این موضوع اینجا را کلیک کنید.", "flag_title": "پرچم‌گذاری این موضوع برای بررسی ناظران", - "merged_message": "This topic has been merged into %2", + "merged_message": "این تاپیک با %2 ادغام شد", "deleted_message": "این موضوع پاک شده است. تنها کاربرانِ با حق مدیریت موضوع می‌توانند آن را ببینند.", "following_topic.message": "از این پس اگر کسی در این موضوع پست بگذارد، شما آگاه خواهید شد.", "not_following_topic.message": "شما این موضوع را تو فهرست موضوعات خوانده نشده می‌بینید، اما وقتی پست جدیدی ارسال می‌شود آگاه‌سازی دریافت نمی‌کنید.", @@ -62,7 +62,7 @@ "thread_tools.lock": "قفل کردن موضوع", "thread_tools.unlock": "باز کردن موضوع", "thread_tools.move": "جابجا کردن موضوع", - "thread_tools.move-posts": "Move Posts", + "thread_tools.move-posts": "انتقال پست ها", "thread_tools.move_all": "جابجایی همه", "thread_tools.select_category": "انتخاب دسته", "thread_tools.fork": "شاخه ساختن از موضوع", @@ -97,7 +97,7 @@ "fork_success": "موضوع با موفقیت منشعب شد! برای رفتن به موضوع انشعابی اینجا را کلیک کنید.", "delete_posts_instruction": "با کلیک بر روی پست شما می خواهید به حذف/پاکسازی", "merge_topics_instruction": "بر روی عنوان موضوعاتی که می خواهید ادغام کنید کلیک کنید", - "move_posts_instruction": "Click the posts you want to move", + "move_posts_instruction": "بر روی پستی که می خواهید انتقال دهید کلیک کنید", "composer.title_placeholder": "عنوان موضوعتان را اینجا بنویسید...", "composer.handle_placeholder": "نام", "composer.discard": "دور بیانداز", @@ -118,7 +118,7 @@ "sort_by": "مرتب‌سازی بر اساس", "oldest_to_newest": "قدیمی‌ترین به جدید‌ترین", "newest_to_oldest": "جدید‌ترین به قدیمی‌ترین", - "most_votes": "Most Votes", + "most_votes": "بیشترین رای ها", "most_posts": "Most Posts", "stale.title": "آیا مایلید به جای آن یک موضوع جدید ایجاد کنید؟", "stale.warning": "موضوعی که شما در حال پاسخگویی به آن هستید قدیمی می باشد. آیا میلید به جای آن یک موضوع جدید ایجاد کنید و در آن به این موضوع ارجاع دهید؟", @@ -126,8 +126,8 @@ "stale.reply_anyway": "در هر صورت می خواهم به این موضوع پاسخ دهم", "link_back": "پاسخ: [%1](%2)", "diffs.title": "تاریخچه ویرایش پست", - "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", - "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.description": "این پست %1 نسخه دارد. بر روی یکی از نسخه ها کلیک کنید تا محتوای پست در آن زمان را ببینید.", + "diffs.no-revisions-description": "این پست %1 نسخه دارد.", + "diffs.current-revision": "نسخه فعلی", + "diffs.original-revision": "نسخه اصلی" } \ No newline at end of file diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 8c5f23274d..10312ad500 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -29,10 +29,10 @@ "ignored": "نادیده گرفته شده", "followers": "دنبال‌کننده‌ها", "following": "دنبال‌شونده‌ها", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "کاربران مسدود شده", + "block_toggle": "مسدود کردن", + "block_user": "مسدود کردن کاربر", + "unblock_user": "رفع مسدودی کاربر", "aboutme": "درباره ی من", "signature": "امضا", "birthday": "روز تولد", @@ -93,7 +93,7 @@ "has_no_upvoted_posts": "این کاربر به هیچ پستی امتیاز نداده است.", "has_no_downvoted_posts": "این کاربر به هیچ پستی رای منفی نداده است.", "has_no_voted_posts": "این کاربر به پست رای نداده است", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "شما هیچ کاربر مسدود شده ای ندارید.", "email_hidden": "ایمیل پنهان شده", "hidden": "پنهان", "paginate_description": "صفحه بندی و نمایش موضوع ها و پست‌ها به جای نمایش بر اساس اسکرول موس", diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index f80faeec7e..f52f0fca8b 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -13,9 +13,9 @@ "headers.acam": "Kontrola-Dostępu-Zezwól-Metody", "headers.acah": "Kontrola-Dostępu-Zezwól-Nagłówki", "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.subdomains": "Uwzględnij subdomeny w nagłówku HSTS", + "hsts.preload": "Zezwól na wstępne ładowanie nagłówka HSTS", + "hsts.help": "Nagłówek HSTS został już wstępnie skonfigurowany dla tej strony. Możesz zdecydować, czy uwzględnić subdomeny i wstępnie ładować flagi w nagłówku. Jeśli masz wątpliwości, możesz zostawić te pola niezaznaczone. Więcej informacji ", "traffic-management": "Zarządzanie ruchem", "traffic.help": "System NodeBB jest dostarczany z modułem, który automatycznie blokuje żądania w przypadku nadmiernego ruchu. Tutaj możesz zmienić te ustawienia, ale ustawienia początkowe są dobrym punktem wyjścia w większości sytuacji.", "traffic.enable": "Włącz zarządzanie ruchem", diff --git a/public/language/pl/admin/settings/uploads.json b/public/language/pl/admin/settings/uploads.json index eae0dde2e1..ae5ae9a2b1 100644 --- a/public/language/pl/admin/settings/uploads.json +++ b/public/language/pl/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "Posty", "allow-files": "Zezwalaj użytkownikom wysyłać pliki", "private": "Oznaczaj wysyłane pliki jako prywatne", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "Rozszerzenia plików, które mają być prywatne", + "private-uploads-extensions-help": "Tutaj wpisz oddzielone przecinkami rozszerzenia plików, które mają być prywatne (np. pdf,xls,doc). Jeśli lista jest pusta, wszystkie pliki są prywatne.", "max-image-width": "Zmniejszaj obrazy do zadanej szerokości (w pikselach)", "max-image-width-help": "(w pikselach, domyślnie: 760px; ustaw 0, aby wyłączyć)", "resize-image-quality": "Poziom jakości użyty przy zmianie rozmiaru", diff --git a/public/language/pl/email.json b/public/language/pl/email.json index 6567b5c85b..58309fc2ea 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -4,8 +4,8 @@ "invite": "Zaproszenie od %1", "greeting_no_name": "Witaj", "greeting_with_name": "Witaj, %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Zweryfikuj swój adres e-mail", + "email.verify.text1": "Twój adres e-mail został zmieniony", "welcome.text1": "Dziękujemy za rejestrację na %1", "welcome.text2": "Aby w pełni aktywować konto, musisz potwierdzić, że podany adres e-mail należy do Ciebie.", "welcome.text3": "Administrator zaakceptował Twoją prośbę o rejestrację. Możesz się teraz zalogować za pomocą swojej nazwy użytkownika i hasła.", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 72dae6cd2c..ee4b8e357a 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -28,7 +28,7 @@ "details.grant": "Nadaj/Cofnij prawa Właściciela", "details.kick": "Wykop", "details.kick_confirm": "Jesteś pewny, że chcesz wyrzucić tego użytkownika z grupy?", - "details.add-member": "Add Member", + "details.add-member": "Dodaj członka", "details.owner_options": "Administracja grupy", "details.group_name": "Nazwa grupy", "details.member_count": "Liczba Członków", diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index f27700efc0..3d80fa9a00 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Czy na pewno chcesz usunąć tę wiadomość?", "chat.retrieving-users": "Pobieram użytkowników...", "chat.manage-room": "Zarządzaj pokojami czatu", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Tu można wyszukiwać użytkowników. Wybrany użytkownik zostanie dodany do czatu. Nowy użytkownik nie zobaczy wiadomości sprzed dołączenia do konwersacji. Tylko właściciele pokoi () mogą usuwać użytkowników z pokoi czatu.", "chat.confirm-chat-with-dnd-user": "Ten użytkownik ustawił status „nie przeszkadzać”. Czy chcesz z nim rozmawiać mimo to?", "chat.rename-room": "Zmień nazwę pokoju", "chat.rename-placeholder": "Tu wpisz nazwę pokoju", @@ -33,7 +33,7 @@ "chat.in-room": "W tym pokoju", "chat.kick": "Wyrzuć", "chat.show-ip": "Pokaż IP", - "chat.owner": "Room Owner", + "chat.owner": "Właściciel pokoju", "composer.compose": "Napisz", "composer.show_preview": "Pokaż podgląd", "composer.hide_preview": "Ukryj podgląd", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 6e8156ad94..39abdf92ab 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -6,10 +6,10 @@ "popular-month": "Tematy popularne w tym miesiącu", "popular-alltime": "Wszystkie popularne tematy", "recent": "Ostatnie tematy", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Tematy z najwyższą liczbą głosów dzisiaj", + "top-week": "Tematy z najwyższą liczbą głosów w tym tygodniu", + "top-month": "Tematy z najwyższą liczbą głosów w tym miesiącu", + "top-alltime": "Tematy z najwyższą liczbą głosów", "moderator-tools": "Narzędzia dla moderatorów", "flagged-content": "Flagi", "ip-blacklist": "Czarna lista adresów IP", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 25fb1c626e..f3ce50799c 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -32,7 +32,7 @@ "blocks": "Blokady", "block_toggle": "Przełącz blokadę", "block_user": "Blokuj użytkownika", - "unblock_user": "Unblock User", + "unblock_user": "Odblokuj użytkownika", "aboutme": "O mnie", "signature": "Sygnatura", "birthday": "Urodziny", @@ -109,9 +109,9 @@ "no-sound": "Bez dźwięku", "upvote-notif-freq": "Częstotliwość informowania o pozytywnych głosach", "upvote-notif-freq.all": "Wszystkie głosy", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "Pierwszy dla postu", "upvote-notif-freq.everyTen": "Co dziesięć głosów", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "Po 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Po 10, 100, 1000...", "upvote-notif-freq.disabled": "Wyłączone", "browsing": "Ustawienia szukania", From fa499aef185630b7a146f6061056b9d7e01639be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 31 Jul 2018 14:26:12 -0400 Subject: [PATCH 076/310] closes #6680 --- src/routes/feeds.js | 4 +++- test/feeds.js | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index eb2e2e051c..07e1cf2379 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -154,7 +154,9 @@ function generateForCategory(req, res, next) { } var cid = req.params.category_id; var category; - + if (!parseInt(cid, 10)) { + return next(); + } async.waterfall([ function (next) { async.parallel({ diff --git a/test/feeds.js b/test/feeds.js index 2155ba5793..ffce775857 100644 --- a/test/feeds.js +++ b/test/feeds.js @@ -83,6 +83,14 @@ describe('feeds', function () { }); }); + it('should 404 if category id is not a number', function (done) { + request(nconf.get('url') + '/category/invalid.rss', function (err, res) { + assert.ifError(err); + assert.equal(res.statusCode, 404); + done(); + }); + }); + it('should redirect if we do not have read privilege', function (done) { privileges.categories.rescind(['topics:read'], cid, 'guests', function (err) { assert.ifError(err); From 0fae083ada702d02d969d5150e592a58acdf6783 Mon Sep 17 00:00:00 2001 From: ChngYekKhai <40588406+ChngYekKhai@users.noreply.github.com> Date: Wed, 1 Aug 2018 19:07:39 +0800 Subject: [PATCH 077/310] Typo fixing(README) (#6681) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4fd7e523ac..4aed8b6e35 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Our minimalist "Persona" theme gets you going right away, no coding experience r ## How can I follow along/contribute? * If you are a developer, feel free to check out the source and submit pull requests. We also have a wide array of [plugins](http://community.nodebb.org/category/7/nodebb-plugins) which would be a great starting point for learning the codebase. -* If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extention of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether. +* If you are a designer, [NodeBB needs themes](http://community.nodebb.org/category/10/nodebb-themes)! NodeBB's theming system allows extension of the base templates as well as styling via LESS or CSS. NodeBB's base theme utilizes [Bootstrap 3](http://getbootstrap.com/) but themes can choose to use a different framework altogether. * If you know languages other than English you can help us translate NodeBB. We use [Transifex](https://www.transifex.com/projects/p/nodebb/) for internationalization. * Please don't forget to **like**, **follow**, and **star our repo**! Join our growing [community](http://community.nodebb.org) to keep up to date with the latest NodeBB development. From 7ff516a1d6b79777f54d6f29c04460ac01fa1dba Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 2 Aug 2018 09:29:03 +0000 Subject: [PATCH 078/310] Latest translations and fallbacks --- public/language/sv/reset_password.json | 2 +- public/language/sv/success.json | 2 +- public/language/sv/topic.json | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/language/sv/reset_password.json b/public/language/sv/reset_password.json index 5a75305e0e..eca97a6652 100644 --- a/public/language/sv/reset_password.json +++ b/public/language/sv/reset_password.json @@ -9,7 +9,7 @@ "repeat_password": "Bekräfta lösenord", "enter_email": "Var god fyll i din e-postadress så skickas ett e-postmeddelande med instruktioner hur du återställer ditt konto.", "enter_email_address": "Skriv in e-postadress", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "password_reset_sent": "Ett e-postmeddelande har skickats till den angivna adressen. Notera att endast ett meddelande per minut skickas.", "invalid_email": "Felaktig e-post / E-post finns inte!", "password_too_short": "Lösenordet är för kort, var god välj ett annat lösenord.", "passwords_do_not_match": "De två lösenorden du har fyllt i matchar ej varandra.", diff --git a/public/language/sv/success.json b/public/language/sv/success.json index b180901bd3..939069385e 100644 --- a/public/language/sv/success.json +++ b/public/language/sv/success.json @@ -1,7 +1,7 @@ { "success": "Lyckat", "topic-post": "Du har nu gjort ett inlägg.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Ditt inlägg väntar nu på att bli godkänt.", "authentication-successful": "Autentisering lyckades", "settings-saved": "Inställningarna sparades." } \ No newline at end of file diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index be85289882..cd74d52542 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -73,8 +73,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", + "thread_tools.merge_topics": "Slå samman ämnen", + "thread_tools.merge": "Slå samman", "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?", @@ -96,8 +96,8 @@ "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", - "move_posts_instruction": "Click the posts you want to move", + "merge_topics_instruction": "Klicka på de ämnen du vill slå samman", + "move_posts_instruction": "Klicka på de inlägg du vill flytta", "composer.title_placeholder": "Skriv in ämnets titel här...", "composer.handle_placeholder": "Namn", "composer.discard": "Avbryt", From ac68c65dc9b1c8c1aa9aa4959caebb6de4daa415 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 3 Aug 2018 09:29:01 +0000 Subject: [PATCH 079/310] Latest translations and fallbacks --- .../language/cs/admin/settings/advanced.json | 2 +- public/language/pt-BR/topic.json | 16 +++++----- public/language/pt-BR/uploads.json | 6 ++-- public/language/pt-BR/user.json | 32 +++++++++---------- public/language/sv/user.json | 4 +-- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/public/language/cs/admin/settings/advanced.json b/public/language/cs/admin/settings/advanced.json index 3966d94385..965f9a9ec9 100644 --- a/public/language/cs/admin/settings/advanced.json +++ b/public/language/cs/admin/settings/advanced.json @@ -13,7 +13,7 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.subdomains": "Zahrnout poddomény v hlavičce HSTS", "hsts.preload": "Allow preloading of HSTS header", "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Správa provozu", diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 35db2ab2f3..b4a00cb837 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -73,8 +73,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", + "thread_tools.merge_topics": "Mesclar Tópicos", + "thread_tools.merge": "Mesclar", "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?", @@ -96,8 +96,8 @@ "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", - "move_posts_instruction": "Click the posts you want to move", + "merge_topics_instruction": "Clique nos tópicos que você deseja mesclar", + "move_posts_instruction": "Clique nas postagens que você deseja mover", "composer.title_placeholder": "Digite aqui o título para o seu tópico...", "composer.handle_placeholder": "Nome", "composer.discard": "Descartar", @@ -118,8 +118,8 @@ "sort_by": "Ordenar por", "oldest_to_newest": "Mais Antigo para Mais Recente", "newest_to_oldest": "Mais Recente para Mais Antigo", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "Mais Votados", + "most_posts": "Mais Postagens", "stale.title": "Criar um novo tópico ao invés disso?", "stale.warning": "O tópico que você está respondendo é bem antigo. Você gostaria de criar um novo tópico ao invés disso, e referenciá-lo em sua resposta?", "stale.create": "Criar um novo tópico", @@ -128,6 +128,6 @@ "diffs.title": "Post Edit History", "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.current-revision": "revisão atual", + "diffs.original-revision": "revisão original" } \ No newline at end of file diff --git a/public/language/pt-BR/uploads.json b/public/language/pt-BR/uploads.json index 68fc458d20..cded001ea9 100644 --- a/public/language/pt-BR/uploads.json +++ b/public/language/pt-BR/uploads.json @@ -3,7 +3,7 @@ "select-file-to-upload": "Escolha um arquivo para fazer upload!", "upload-success": "Upload realizado com sucesso!", "maximum-file-size": "No máximo %1 kb", - "no-uploads-found": "No uploads found", - "public-uploads-info": "Uploads are public, all visitors can see them.", - "private-uploads-info": "Uploads are private, only logged in users can see them." + "no-uploads-found": "Uploads não encontrados", + "public-uploads-info": "Uploads publicos, todos os visitantes poderão vê-los", + "private-uploads-info": "Uploads privados, somente usuários logados poderão vê-los" } \ No newline at end of file diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 6fe61b2ee1..1593a4d286 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -29,10 +29,10 @@ "ignored": "Ignorado", "followers": "Seguidores", "following": "Seguindo", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "Bloqueados", + "block_toggle": "Alternar Bloqueio", + "block_user": "Bloquear Usuário", + "unblock_user": "Desbloquear Usuário", "aboutme": "Sobre mim", "signature": "Assinatura", "birthday": "Aniversário", @@ -150,24 +150,24 @@ "info.moderation-note": "Nota da Moderação", "info.moderation-note.success": "Nota da moderação salva", "info.moderation-note.add": "Adicionar nota", - "consent.title": "Your Rights & Consent", - "consent.lead": "This community forum collects and processes your personal information.", + "consent.title": "Seus direitos & Consentimento", + "consent.lead": "Este fórum da comunidade coleta e processa suas informações pessoais.", "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", - "consent.give": "Give consent", - "consent.right_of_access": "You have the Right of Access", - "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", - "consent.right_to_rectification": "You have the Right to Rectification", - "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", - "consent.right_to_erasure": "You have the Right to Erasure", + "consent.give": "Dar o consentimento", + "consent.right_of_access": "Você tem o Direito de Acessar", + "consent.right_of_access_description": "Você tem o direito de acessar todos os dados coletados por este site mediante solicitação. Você pode recuperar uma cópia desses dados clicando no botão apropriado abaixo.", + "consent.right_to_rectification": "Você tem o Direito de Retificar", + "consent.right_to_rectification_description": "Você tem o direito de alterar ou atualizar quaisquer dados imprecisos fornecidos a nós. Seu perfil pode ser atualizado editando seu perfil e postar conteúdo sempre pode ser editado. Se esse não for o caso, entre em contato com a equipe administrativa do site.", + "consent.right_to_erasure": "Você tem o Direito de Apagar", "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", - "consent.export_profile": "Export Profile (.csv)", + "consent.right_to_data_portability": "Você tem o Direito de Portabilidade de Dados", + "consent.right_to_data_portability_description": "Você pode solicitar de nós uma exportação legível por máquina de quaisquer dados coletados sobre você e sua conta. Você pode fazer isso clicando no botão apropriado abaixo.", + "consent.export_profile": "Exportar Perfil (.csv)", "consent.export_uploads": "Export Uploaded Content (.zip)", - "consent.export_posts": "Export Posts (.csv)" + "consent.export_posts": "Exportar Posts (.csv)" } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index aa30b37c66..1bad4271c1 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -1,7 +1,7 @@ { "banned": "Bannlyst", "offline": "Offline", - "deleted": "Deleted", + "deleted": "Raderad", "username": "Användarnamn", "joindate": "Gick med", "postcount": "Antal inlägg", @@ -12,7 +12,7 @@ "ban_account_confirm": "Vill du verkligen bannlysa den här användaren?", "unban_account": "Ta bort bannlysning", "delete_account": "Ta bort ämne", - "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your password to confirm that you wish to destroy this account.", + "delete_account_confirm": "Är du säker på att du vill radera ditt konto?
Denna åtgärd går inte att ångra och du kommer inte kunna återställa ditt konto

Skriv in ditt användarnamn för att bekräfta att du vill radera ditt konto.", "delete_this_account_confirm": "Är du säker på att du vill ta bort detta konto?
Detta går ej att ångra - data går förlorad för alltid

", "account-deleted": "Kontot raderat", "fullname": "Hela namnet", From 1a10659f596b21e460e909ae6f6bca1fbc40711c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 30 Jul 2018 18:55:17 +0000 Subject: [PATCH 080/310] Update dependency postcss to v7.0.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 93f63cf3a8..222e8df8dd 100644 --- a/install/package.json +++ b/install/package.json @@ -82,7 +82,7 @@ "nodemailer": "^4.6.5", "passport": "^0.4.0", "passport-local": "1.0.0", - "postcss": "7.0.1", + "postcss": "7.0.2", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", From 15c9f3340449c2a7ad2da0961a9044bef3842d9e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 3 Aug 2018 04:41:11 +0000 Subject: [PATCH 081/310] Update dependency validator to v10.5.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 222e8df8dd..341ef67c90 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "spider-detector": "1.0.18", "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", - "validator": "10.4.0", + "validator": "10.5.0", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "^4.1.1", From 1c286e45361dc6936901aa89b71d9f67b5d2f7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 3 Aug 2018 18:50:39 -0400 Subject: [PATCH 082/310] not even used --- install/data/defaults.json | 1 - public/language/en-GB/admin/settings/pagination.json | 3 +-- src/views/admin/settings/pagination.tpl | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 1a901fb3c9..d883742495 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -36,7 +36,6 @@ "allowPrivateGroups": 1, "unreadCutoff": 2, "bookmarkThreshold": 5, - "topicsPerList": 20, "autoDetectLang": 1, "min:rep:flag": 0, "notificationType_upvote": "notification", diff --git a/public/language/en-GB/admin/settings/pagination.json b/public/language/en-GB/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/en-GB/admin/settings/pagination.json +++ b/public/language/en-GB/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/src/views/admin/settings/pagination.tpl b/src/views/admin/settings/pagination.tpl index 5f4d77bde3..6a0496f07d 100644 --- a/src/views/admin/settings/pagination.tpl +++ b/src/views/admin/settings/pagination.tpl @@ -30,7 +30,6 @@
[[admin/settings/pagination:topics-per-page]]

[[admin/settings/pagination:max-topics-per-page]]

- [[admin/settings/pagination:initial-num-load]]
From 537c7f91fd2ed1b3632dc1079295bfc607237a57 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 5 Aug 2018 09:28:42 +0000 Subject: [PATCH 083/310] Latest translations and fallbacks --- .../language/de/admin/settings/advanced.json | 6 +- .../language/de/admin/settings/uploads.json | 4 +- public/language/de/email.json | 4 +- public/language/de/groups.json | 2 +- public/language/de/modules.json | 4 +- public/language/de/pages.json | 8 +- public/language/de/user.json | 8 +- public/language/ja/notifications.json | 2 +- public/language/sv/email.json | 16 +-- public/language/sv/error.json | 54 ++++----- public/language/sv/flags.json | 110 +++++++++--------- public/language/sv/global.json | 18 +-- public/language/sv/groups.json | 6 +- public/language/sv/modules.json | 34 +++--- public/language/sv/notifications.json | 58 ++++----- public/language/sv/pages.json | 26 ++--- public/language/sv/register.json | 6 +- public/language/sv/search.json | 10 +- public/language/sv/topic.json | 34 +++--- public/language/sv/unread.json | 4 +- public/language/sv/uploads.json | 6 +- public/language/sv/user.json | 94 +++++++-------- 22 files changed, 257 insertions(+), 257 deletions(-) diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index fe33477e54..e34e319715 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -13,9 +13,9 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.subdomains": "Subdomains in HSTS Header einbinden", + "hsts.preload": "Vorabladen von HSTS Header erlauben", + "hsts.help": "Ein HSTS Header ist bereits für diese Seite vorkonfiguriert. Du kannst subdomains und preloading flags zur inklusion in den Header auswählen. Im zweifel kannst du diese abgewählt lassen.Mehr erfahren", "traffic-management": "Traffic Management", "traffic.help": "NodeBB wird mit einem Modul geliefert, welches automatisch anfragen in High-Traffic Situationen blockiert. Du kannst diese Einstellungen hier ändern, auch wenn die Standardeinstellungen einen guten Anfang darstellen sollten", "traffic.enable": "Traffic Management aktivieren", diff --git a/public/language/de/admin/settings/uploads.json b/public/language/de/admin/settings/uploads.json index be4f158581..7064f9fea2 100644 --- a/public/language/de/admin/settings/uploads.json +++ b/public/language/de/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "Beiträge", "allow-files": "Nutzern erlauben normale Dateien hochzuladen", "private": "Hochgeladene Dateien privatisieren", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "Private Dateiendungen", + "private-uploads-extensions-help": "Gib eine Komma-Separierte Liste mit Dateiendungen an, die privatisiert werden sollen (z.B. pdf,xls,doc). Eine leere Liste bedeutet, dass alle Dateien privat sind.", "max-image-width": "Bilder zu einer bestimmten Breite runterskalieren", "max-image-width-help": "(in Pixeln, standard 760 pixel, auf 0 setzen um zu deaktivieren)", "resize-image-quality": "Zu benutzende Qualität beim verändern von Bildauflösungen", diff --git a/public/language/de/email.json b/public/language/de/email.json index 2c716c8d5c..bb10d5ae44 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -4,8 +4,8 @@ "invite": "Einladung von %1", "greeting_no_name": "Hallo", "greeting_with_name": "Hallo %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Bitte bestätige deine Email-Adresse", + "email.verify.text1": "Deine Email-Adresse hat sich verändert!", "welcome.text1": "Vielen Dank für die Registrierung bei %1!", "welcome.text2": "Um dein Konto vollständig zu aktivieren, müssen wir überprüfen, ob du Besitzer der E-Mail-Adresse bist, mit der du dich registriert hast.", "welcome.text3": "Ein Administrator hat deine Registrierung aktzeptiert. Du kannst dich jetzt mit deinem Benutzernamen/Passwort einloggen.", diff --git a/public/language/de/groups.json b/public/language/de/groups.json index 83f53237ab..c06711de45 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -28,7 +28,7 @@ "details.grant": "Gewähre/widerrufe Besitz", "details.kick": "Kick", "details.kick_confirm": "Sind Sie sicher, dass Sie dieses Mitglied aus der Gruppe entfernen möchten?", - "details.add-member": "Add Member", + "details.add-member": "Mitglied hinzufügen", "details.owner_options": "Gruppenadministration", "details.group_name": "Gruppenname", "details.member_count": "Mitgliederanzahl", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 7fa904945d..c8e52c8433 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Bist du sicher, dass du diese Nachricht löschen möchtest?", "chat.retrieving-users": "Rufe Benutzer ab", "chat.manage-room": "Chat-Room managen", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Suche hier nach Usern. Auswählen fügt den User hinzu. Der neue User wird nicht in der Lage sein Chat Nachrichten zu lesen, die geschrieben wurden bevor er der Konversation hinzugefügt wurde. Ausschließlich Raumbesitzer () können User von Chat Rooms entfernen.", "chat.confirm-chat-with-dnd-user": "Dieser Benutzer hat seinen Status auf DnD (Bitte nicht stören) gesetzt. Möchtest du dennoch mit ihm chatten?", "chat.rename-room": "Raum umbenennen", "chat.rename-placeholder": "Gib deinen Chatraumnamen hier ein", @@ -33,7 +33,7 @@ "chat.in-room": "In diesem Chat-Room", "chat.kick": "Rauswerfen", "chat.show-ip": "IP anzeigen", - "chat.owner": "Room Owner", + "chat.owner": "Raumbesitzer", "composer.compose": "Verfassen", "composer.show_preview": "Vorschau zeigen", "composer.hide_preview": "Vorschau ausblenden", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 9bf0bb6aa7..11c8da5fc8 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -6,10 +6,10 @@ "popular-month": "Beliebte Themen dieses Monats", "popular-alltime": "Beliebteste Themen", "recent": "Neueste Themen", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Bestbewerteste Themen von Heute", + "top-week": "Bestbewerteste Themen dieser Woche", + "top-month": "Bestbewerteste Themen dieses Monats", + "top-alltime": "Bestbewerteste Themen", "moderator-tools": "Moderator-Werkzeuge", "flagged-content": "Gemeldeter Inhalt", "ip-blacklist": "IP Blacklist", diff --git a/public/language/de/user.json b/public/language/de/user.json index 953a661fc9..f8e17aaf01 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -31,8 +31,8 @@ "following": "Folge ich", "blocks": "Blockiert", "block_toggle": "Ent-/Blocken", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "User blockieren", + "unblock_user": "User entblocken", "aboutme": "Über mich", "signature": "Signatur", "birthday": "Geburtstag", @@ -109,9 +109,9 @@ "no-sound": "Kein Ton", "upvote-notif-freq": "Benachrichtigungshäufigkeit für positive Bewertungen", "upvote-notif-freq.all": "Alle positiven Bewertungen", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "Erster pro Beitrag", "upvote-notif-freq.everyTen": "Alle 10 positiven Bewertungen", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "Bei 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Bei 10, 100, 1000...", "upvote-notif-freq.disabled": "Deaktiviert", "browsing": "Browsing", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index a535562dcd..ce635ae28c 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -25,7 +25,7 @@ "upvoted_your_post_in_dual": "%1さんと%2さんが%3に高評価をつけました。", "upvoted_your_post_in_multiple": "%1 と%2 などのユーザーが、あなたの投稿 %3 に高評価をつけました。", "moved_your_post": "%1 は、あなたの投稿 %2 に移動しました。", - "moved_your_topic": "%1%2 へ移動しました。", + "moved_your_topic": "%1%2 を移動しました。", "user_flagged_post_in": "%1%2 の投稿にフラグを付けました。", "user_flagged_post_in_dual": "%1%2%3 の投稿にフラグを立てました。", "user_flagged_post_in_multiple": "%1 と %2 または他のユーザーが投稿 %3にフラグをつけました。", diff --git a/public/language/sv/email.json b/public/language/sv/email.json index 1d6cc904d7..6fec42213b 100644 --- a/public/language/sv/email.json +++ b/public/language/sv/email.json @@ -4,14 +4,14 @@ "invite": "Inbjudan ifrån %1", "greeting_no_name": "Hej", "greeting_with_name": "Hej %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Vänligen bekräfta din e-postadress", + "email.verify.text1": "Din e-postadress har ändrats!", "welcome.text1": "Tack för att du registerar dig på %1!", "welcome.text2": "För att slutföra aktiveringen av ditt konto, behöver vi verifiera att du har tillgång till den e-postadress du registrerade dig med.", "welcome.text3": "En administrator har accepterat din registreringsansökan. Du kan logga in med ditt användarnamn och lösenord nu.", "welcome.cta": "Klicka här för att bekräfta din e-postadress ", "invitation.text1": "%1 har bjudit in dig till %2", - "invitation.text2": "Your invitation will expire in %1 days.", + "invitation.text2": "Din inbjudan går ut om %1 dagar.", "invitation.ctr": "Klicka här för att skapa ditt konto.", "reset.text1": "Vi fick en förfrågan om att återställa ditt lösenord, möjligen för att du har glömt det. Om detta inte är fallet, så kan du bortse från det här epostmeddelandet. ", "reset.text2": "För att fortsätta med återställning av lösenordet så kan du klicka på följande länk:", @@ -33,12 +33,12 @@ "notif.chat.unsub.info": "Denna notifikation skickades till dig på grund av dina inställningar för prenumerationer.", "notif.post.cta": "Klicka här för att läsa hela ämnet", "notif.post.unsub.info": "Det här meddelandet fick du på grund av dina inställningar för prenumeration. ", - "notif.cta": "Click here to go to forum", + "notif.cta": "Klicka här för att gå till forum", "test.text1": "\nDet här är ett testmeddelande som verifierar att e-posten är korrekt installerad för din NodeBB. ", "unsub.cta": "Klicka här för att ändra inställningarna", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.subject": "Du har blivit bannlyst från %1", + "banned.text1": "Användaren %1 har blivit bannlyst från %2.", + "banned.text2": "Denna bannlysning gäller t.o.m. %1", + "banned.text3": "Anledningen till din bannlysning är:", "closing": "Tack!" } \ No newline at end of file diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 4c873192f3..63ad3646e9 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -1,24 +1,24 @@ { "invalid-data": "Ogiltig data", - "invalid-json": "Invalid JSON", + "invalid-json": "Ogiltig JSON", "not-logged-in": "Du verkar inte vara inloggad.", "account-locked": "Ditt konto har tillfälligt blivit låst", "search-requires-login": "Sökning kräver ett konto, var god logga in eller registrera dig.", - "goback": "Press back to return to the previous page", + "goback": "Tryck på tillbakaknappen för att återgå till förra sidan", "invalid-cid": "Ogiltigt id för kategori", "invalid-tid": "Ogiltigt id för ämne", "invalid-pid": "Ogiltigt id för inlägg", "invalid-uid": "Ogiltigt id för användare", "invalid-username": "Ogiltigt användarnamn", "invalid-email": "Ogiltig epostadress", - "invalid-title": "Invalid title", + "invalid-title": "Ogiltig titel", "invalid-user-data": "Ogiltig användardata", "invalid-password": "Ogiltigt lösenord", - "invalid-login-credentials": "Invalid login credentials", + "invalid-login-credentials": "Ogiltig inloggning", "invalid-username-or-password": "Specificera både användarnamn och lösenord", "invalid-search-term": "Ogiltig sökterm", - "invalid-url": "Invalid URL", - "local-login-disabled": "Local login system has been disabled for non-privileged accounts.", + "invalid-url": "Ogiltig URL", + "local-login-disabled": "Lokala inloggningssystem har stängts av för icke-privilegierade konton.", "csrf-invalid": "Det gick inte att logga in dig, sannolikt på grund av en utgången session. Var god försök igen", "invalid-pagination-value": "Ogiltigt värde för siduppdelning. Värdet måste vara mellan %1 och %2", "username-taken": "Användarnamn upptaget", @@ -34,8 +34,8 @@ "username-too-long": "Användarnamnet är för långt", "password-too-long": "Lösenordet är för långt", "user-banned": "Användare bannlyst", - "user-banned-reason": "Sorry, this account has been banned (Reason: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason": "Vi beklagar, men detta konto har blivit bannlyst (Anledning: %1)", + "user-banned-reason-until": "Vi beklagar, men detta konto har blivit bannlyst till %1 (Anledning: %2)", "user-too-new": "När du är ny medlem måste du vänta %1 sekund(er) innan du gör ditt första inlägg", "blacklisted-ip": "Din IP-adress har blivit bannlyst från det här forumet. Om du tror att det beror på ett misstag, vad god kontakta en administratör. ", "ban-expiry-missing": "Ange ett slutdatum för denna banning", @@ -83,7 +83,7 @@ "cant-ban-other-admins": "Du kan inte bannlysa andra administratörer!", "cant-remove-last-admin": "Du är den enda administratören. Lägg till en annan användare som administratör innan du tar bort dig själv.", "cant-delete-admin": "Ta bort administratörsbehörighet från detta konto innan du försöker ta bort den.", - "invalid-image": "Invalid image", + "invalid-image": "Ogiltig bild", "invalid-image-type": "Ogiltig bildtyp. Tillåtna typer är: %1", "invalid-image-extension": "Ogiltigt bildformat", "invalid-file-type": "Ogiltig filtyp. Tillåtna typer är: %1", @@ -111,33 +111,33 @@ "chat-disabled": "Chatten är inaktiverad", "too-many-messages": "Du har skickat för många meddelanden, var god vänta", "invalid-chat-message": "Ogiltigt chattmeddelande", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", + "chat-message-too-long": "Chattmeddelanden får inte vara längre än %1 tecken.", "cant-edit-chat-message": "Du har inte rättigheter att redigera det här meddelandet", "cant-remove-last-user": "Du kan inte ta bort den sista användaren", "cant-delete-chat-message": "Du har inte rättigheter att radera det här meddelandet", - "chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting", - "chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting", - "chat-deleted-already": "This chat message has already been deleted.", - "chat-restored'already": "This chat message has already been restored.", + "chat-edit-duration-expired": "Du kan endast redigera chattmeddelanden %1 sekunder efter att du skrivit dem", + "chat-delete-duration-expired": "Du kan endast radera chattmeddelanden %1 sekunder efter att du skrivit dem", + "chat-deleted-already": "Detta chattmeddelande har redan raderats.", + "chat-restored'already": "Detta chattmeddelande har redan återställts.", "already-voting-for-this-post": "Du har redan röstat på det här inlägget.", "reputation-system-disabled": "Ryktessystemet är inaktiverat.", "downvoting-disabled": "Nedröstning är inaktiverat", "not-enough-reputation-to-downvote": "Du har inte tillräckligt förtroende för att rösta ner det här meddelandet", "not-enough-reputation-to-flag": "Du har inte tillräckligt förtroende för att flagga det här inlägget.", - "not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website", - "not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me", - "not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature", - "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture", - "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture", + "not-enough-reputation-min-rep-website": "Du har inte tillräckligt förtroende för att lägga till en webbsida.", + "not-enough-reputation-min-rep-aboutme": "Du har inte tillräckligt förtroende för att lägga till en självbeskrivning.", + "not-enough-reputation-min-rep-signature": "Du har inte tillräckligt förtroende för att lägga till en signatur.", + "not-enough-reputation-min-rep-profile-picture": "Du har inte tillräckligt förtroende för att lägga till en profilbild", + "not-enough-reputation-min-rep-cover-picture": "Du har inte tillräckligt förtroende för att lägga till en omslagsbild", "already-flagged": "Du har redan flaggat det här inlägget", - "self-vote": "You cannot vote on your own post", + "self-vote": "Du kan inte rösta på ditt eget inlägg.", "reload-failed": "NodeBB stötte på problem med att ladda om: \"%1\". NodeBB kommer fortsätta servera befintliga resurser till klienten, men du borde återställa det du gjorde innan du försökte ladda om.", "registration-error": "Registreringsfel", "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", - "sso-multiple-association": "You cannot associate multiple accounts from this service to your NodeBB account. Please dissociate your existing account and try again.", + "sso-registration-disabled": "Registrering är inte tillgänglig för %1-konton, vänligen registrera med en e-postadress först.", + "sso-multiple-association": "Du kan inte associera flera konton från denna tjänst till ditt NodeBB-konto. Vänligen kopppla bort ditt existerande konto och försök igen.", "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", @@ -147,9 +147,9 @@ "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.", - "no-topics-selected": "No topics selected!", - "cant-move-to-same-topic": "Can't move post to same topic!", - "cannot-block-self": "You cannot block yourself!", - "cannot-block-privileged": "You cannot block administrators or global moderators", - "no-connection": "There seems to be a problem with your internet connection" + "no-topics-selected": "Inga ämnen valda!", + "cant-move-to-same-topic": "Kan inte flytta inlägg till samma ämne!", + "cannot-block-self": "Du kan inte blockera dig själv!", + "cannot-block-privileged": "Du kan inte blockera administratörer eller globala moderatorer", + "no-connection": "Det verkar vara något problem med din internetanslutning" } \ No newline at end of file diff --git a/public/language/sv/flags.json b/public/language/sv/flags.json index 35fc87011a..8e0476d5f7 100644 --- a/public/language/sv/flags.json +++ b/public/language/sv/flags.json @@ -1,65 +1,65 @@ { - "state": "State", - "reporter": "Reporter", - "reported-at": "Reported At", - "description": "Description", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "state": "Status", + "reporter": "Repporterare", + "reported-at": "Rapporterad vid tid", + "description": "Beskrivning", + "no-flags": "Yippie! Inga flaggor funna.", + "assignee": "Tilldelad", + "update": "Uppdatera", + "updated": "Uppdatering", + "target-purged": "Innehållet denna flagga refererar till har rensats bort och är inte längre tillgängligt.", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-type-user": "User", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", + "quick-filters": "Snabbfilter", + "filter-active": "Ett eller flera filter är aktiva i denna lista med flaggor", + "filter-reset": "Ta bort filter", + "filters": "Filterinställningar", + "filter-reporterId": "Rapporterandes UID", + "filter-targetUid": "Flaggades UID", + "filter-type": "Flaggtyp", + "filter-type-all": "Allt innehåll", + "filter-type-post": "Inlägg", + "filter-type-user": "Användare", + "filter-state": "Status", + "filter-assignee": "Tilldelad persons UID", + "filter-cid": "Kategori", + "filter-quick-mine": "Tilldelade till mig", + "filter-cid-all": "Alla kategorier", + "apply-filters": "Applicera filter", - "quick-links": "Quick Links", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", + "quick-links": "Snabblänkar", + "flagged-user": "Flaggad användare", + "view-profile": "Visa profil", + "start-new-chat": "Påbörja ny chatt", + "go-to-target": "Visa flaggans ämne", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Visa profil", + "user-edit": "Redigera profil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Flaggans anteckningar", + "add-note": "Lägg till anteckning", + "no-notes": "Inga delade anteckningar.", - "history": "Flag History", - "back": "Back to Flags List", - "no-history": "No flag history.", + "history": "Flagghistorik", + "back": "Tillbaks till flagglista", + "no-history": "Ingen flagghitorik.", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", - "note-added": "Note Added", + "state-all": "Alla status", + "state-open": "Nya/Öppna", + "state-wip": "Pågående arbete", + "state-resolved": "Löst", + "state-rejected": "Avvisad", + "no-assignee": "Ej tilldelad", + "note-added": "Anteckning tillagd", - "modal-title": "Report Inappropriate Content", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-title": "Rapportera opassande innehåll", + "modal-body": "Vänligen ange anledningen till att du flaggar %1 %2 för granskning. Alternativt, använd en av snabbrapporteringsknapparna.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", - "modal-reason-other": "Other (specify below)", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation.", - "modal-submit-confirm": "Confirm Submission", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined." + "modal-reason-offensive": "Kränkande", + "modal-reason-other": "Annat (ange nedan)", + "modal-reason-custom": "Anledning för rapportering av detta innehåll...", + "modal-submit": "Skicka in rapport", + "modal-submit-success": "Innehållet har flaggats för moderering.", + "modal-submit-confirm": "Bekräfta inskickning", + "modal-submit-confirm-text": "Du har redan en specifik anledning vald. Vill du verkligen skicka in en snabbrapport?", + "modal-submit-confirm-text-help": "Om du skickar in en snabbrapport så förlorar du de specifika motivationer du angivit." } \ No newline at end of file diff --git a/public/language/sv/global.json b/public/language/sv/global.json index a66a996b34..4698438759 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -53,7 +53,7 @@ "topics": "Ämnen", "posts": "Inlägg", "best": "Bästa", - "votes": "Votes", + "votes": "Röster", "upvoters": "Uppröstare", "upvoted": "Uppröstad", "downvoters": "Nerröstare", @@ -97,16 +97,16 @@ "enter_page_number": "Skriv in sidnummer", "upload_file": "Ladda upp en fil", "upload": "Ladda upp", - "uploads": "Uploads", + "uploads": "Uppladdningar", "allowed-file-types": "Tillåtna filtyper är %1", "unsaved-changes": "Du har ändringar som inte sparats. Är du säker på att du vill navigera bort?", "reconnecting-message": "Ser ut som din anslutning till %1 gick förlorad, vänta medan vi försöker att återansluta.", "play": "Spela", - "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", - "user-search-prompt": "Type something here to find users..." + "cookies.message": "Denna webbsida använder cookies för att säkerställa bästa möjliga upplevelse.", + "cookies.accept": "Jag förstår!", + "cookies.learn_more": "Läs mer", + "edited": "Redigerad", + "disabled": "Avstängd", + "select": "Välj", + "user-search-prompt": "Skriv något för att hitta användare" } \ No newline at end of file diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index 4f1a0c4261..befb03b36b 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -27,8 +27,8 @@ "details.disableJoinRequests": "Inaktivera förfrågningar om att gå med", "details.grant": "Tilldela/Dra tillbaka ägarskap", "details.kick": "Sparka ut", - "details.kick_confirm": "Are you sure you want to remove this member from the group?", - "details.add-member": "Add Member", + "details.kick_confirm": "Vill du verkligen avlägsna denna användare från gruppen?", + "details.add-member": "Lägg till medlem", "details.owner_options": "Gruppadministration", "details.group_name": "Gruppnamn", "details.member_count": "Medlemsantal", @@ -55,5 +55,5 @@ "upload-group-cover": "Ladda upp omslagsbild för grupp", "bulk-invite-instructions": "Ange en lista med kommaseparerade användarnamn som du vill bjuda in till denna grupp", "bulk-invite": "Massinbjudning", - "remove_group_cover_confirm": "Are you sure you want to remove the cover picture?" + "remove_group_cover_confirm": "Vill du verkligen ta bort omslagsbilden?" } \ No newline at end of file diff --git a/public/language/sv/modules.json b/public/language/sv/modules.json index cd8e059e2a..394dde4f43 100644 --- a/public/language/sv/modules.json +++ b/public/language/sv/modules.json @@ -1,5 +1,5 @@ { - "chat.chatting_with": "Chat with", + "chat.chatting_with": "Chatta med", "chat.placeholder": "Skriv chattmeddelande här och tryck sen Enter för att skicka ", "chat.send": "Skicka", "chat.no_active": "Du har inte några aktiva chattar.", @@ -12,28 +12,28 @@ "chat.recent-chats": "Senaste chattarna", "chat.contacts": "Kontakter ", "chat.message-history": "Historik för meddelande", - "chat.options": "Chat options", + "chat.options": "Chattinställningar", "chat.pop-out": "Utskjutande chatt", - "chat.minimize": "Minimize", + "chat.minimize": "Minimera", "chat.maximize": "Maximera", "chat.seven_days": "7 dagar", "chat.thirty_days": "30 dagar", "chat.three_months": "3 månader", "chat.delete_message_confirm": "Är du säker på att du vill radera det här meddelandet?", - "chat.retrieving-users": "Retrieving users...", - "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", - "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", - "chat.rename-room": "Rename Room", - "chat.rename-placeholder": "Enter your room name here", - "chat.rename-help": "The room name set here will be viewable by all participants in the room.", - "chat.leave": "Leave Chat", - "chat.leave-prompt": "Are you sure you wish to leave this chat?", - "chat.leave-help": "Leaving this chat will remove you from future correspondence in this chat. If you are re-added in the future, you will not see any chat history from prior to your re-joining.", - "chat.in-room": "In this room", - "chat.kick": "Kick", - "chat.show-ip": "Show IP", - "chat.owner": "Room Owner", + "chat.retrieving-users": "Hämtar användare...", + "chat.manage-room": "Hantera chattrum", + "chat.add-user-help": "Sök efter användare här. Vid markering läggs användaren till i chatten. Den nya användaren kommer inte kunna se chattmeddelanden som skrevs innan de lades till i konversationen. Endast chattrumsägare () kan avlägsna användare från chattrum.", + "chat.confirm-chat-with-dnd-user": "Denna användare har satt sin status till Stör Ej. Vill du fortfarande chatta med dem?", + "chat.rename-room": "Byt namn på rum", + "chat.rename-placeholder": "Skriv in rummets namn här", + "chat.rename-help": "Rummets namn som skrivs in här kommer vara synligt för alla deltagare i rummet.", + "chat.leave": "Lämna chatt", + "chat.leave-prompt": "Är du säker att du vill lämna denna chatt?", + "chat.leave-help": "Om du lämnar denna chatt kommer du inte vara med i framtida korrespondens i denna chatt. Om du läggs till igen i framtiden, kommer du inte se någon chatthistorik från innan du lades till.", + "chat.in-room": "I detta rum", + "chat.kick": "Sparka ut", + "chat.show-ip": "Visa IP", + "chat.owner": "Rummets ägare", "composer.compose": "Komponera", "composer.show_preview": "Visa förhandsgranskning", "composer.hide_preview": "Dölj förhandsgranskning", diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index 46d77ab13f..3b8babc836 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -9,17 +9,17 @@ "continue_to": "Fortsätt till %1", "return_to": "Återgå till %1", "new_notification": "Ny notis", - "new_notification_from": "You have a new Notification from %1", + "new_notification_from": "Du har en ny notis från %1", "you_have_unread_notifications": "Du har olästa notiser.", - "all": "All", - "topics": "Topics", - "replies": "Replies", - "chat": "Chats", - "follows": "Follows", - "upvote": "Upvotes", - "new-flags": "New Flags", - "my-flags": "Flags assigned to me", - "bans": "Bans", + "all": "Alla", + "topics": "Ämnen", + "replies": "Svar", + "chat": "Chattar", + "follows": "Följningar", + "upvote": "Uppröster", + "new-flags": "Nya flaggor", + "my-flags": "Mina tilldelade flaggor", + "bans": "Bannlysningar", "new_message_from": "Nytt medelande från %1", "upvoted_your_post_in": "%1 har röstat upp ditt inlägg i %2", "upvoted_your_post_in_dual": "%1 och %2 har röstat upp ditt inlägg i %3.", @@ -29,9 +29,9 @@ "user_flagged_post_in": "%1 flaggade ett inlägg i %2", "user_flagged_post_in_dual": "%1 och %2 rapporterade ett inlägg i %3", "user_flagged_post_in_multiple": "%1 och %2 andra rapporterade ett inlägg i %3", - "user_flagged_user": "%1 flagged a user profile (%2)", - "user_flagged_user_dual": "%1 and %2 flagged a user profile (%3)", - "user_flagged_user_multiple": "%1 and %2 others flagged a user profile (%3)", + "user_flagged_user": "%1 flaggade en användarprofil (%2)", + "user_flagged_user_dual": "%1 och %2 flaggade en användarprofil (%3)", + "user_flagged_user_multiple": "%1 och %2 andra flaggade en användarprofil (%3)", "user_posted_to": "%1 har skrivit ett svar på: %2", "user_posted_to_dual": "%1 och %2 har svarat på: %3", "user_posted_to_multiple": "%1 och %2 andra har svarat på: %3", @@ -41,24 +41,24 @@ "user_started_following_you_multiple": "%1 och %2 andra började följa dig.", "new_register": "%1 skickade en registreringsförfrågan.", "new_register_multiple": "Det finns %1 förfrågningar om registrering som inväntar granskning.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", - "post_awaiting_review": "Post awaiting review", + "flag_assigned_to_you": "Flaggan %1 har tillskrivits dig", + "post_awaiting_review": "Inlägg väntar på granskning", "email-confirmed": "E-post bekräftad", "email-confirmed-message": "Tack för att du bekräftat din e-postadress. Ditt konto är nu fullt ut aktiverat.", "email-confirm-error-message": "Det uppstod ett problem med bekräftelsen av din e-postadress. Kanske var koden felaktig eller ogiltig.", "email-confirm-sent": "Bekräftelsemeddelande skickat.", - "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": "Inga", + "notification_only": "Endast notis", + "email_only": "Endast e-post", + "notification_and_email": "Notis och e-post", + "notificationType_upvote": "När någon röstar upp ditt inlägg", + "notificationType_new-topic": "När någon du följer skapar ett ämne", + "notificationType_new-reply": "När ett nytt svar skrivs inom ett ämne du följer", + "notificationType_follow": "När någon börjar följa dig", + "notificationType_new-chat": "När du får ett chattmeddelande", + "notificationType_group-invite": "När du får en gruppinbjudan", + "notificationType_new-register": "När någon läggs till i registreringskön", + "notificationType_post-queue": "När ett nytt inlägg läggs i kön", + "notificationType_new-post-flag": "När ett nytt inlägg flaggas", + "notificationType_new-user-flag": "När en användare flaggas" } \ No newline at end of file diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 2ff8e81d4c..2c7d6c1637 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -6,14 +6,14 @@ "popular-month": "Populära ämnen denna månad", "popular-alltime": "Populäraste ämnena genom tiderna", "recent": "Senaste ämnena", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", - "moderator-tools": "Moderator Tools", - "flagged-content": "Flagged Content", + "top-day": "Toppröstade ämnen idag", + "top-week": "Toppröstade ämnen denna vecka", + "top-month": "Toppröstade ämnen denna månad", + "top-alltime": "Toppröstade ämnen", + "moderator-tools": "Moderatorverktyg", + "flagged-content": "Flaggat innehåll", "ip-blacklist": "IP Svartlista", - "post-queue": "Post Queue", + "post-queue": "Inllägskö", "users/online": "Användare online", "users/latest": "Senaste Användare", "users/sort-posts": "Användare med flest inlägg", @@ -23,7 +23,7 @@ "users/search": "Användar Sök", "notifications": "Notiser", "tags": "Etiketter", - "tag": "Topics tagged under "%1"", + "tag": "Ämnen taggade med "%1"", "register": "Registrera ett konto", "registration-complete": "Registrering färdig", "login": "Logga in på ditt konto", @@ -33,8 +33,8 @@ "group": "%1 grupp", "chats": "Chattar", "chat": "Chattar med %1", - "flags": "Flags", - "flag-details": "Flag %1 Details", + "flags": "Flaggor", + "flag-details": "Detaljer för flaggan %1", "account/edit": "Redigerar \"%1\"", "account/edit/password": "Redigerar lösenord för \"%1\"", "account/edit/username": "Redigerar användarnamn för \"%1\"", @@ -48,12 +48,12 @@ "account/bookmarks": "%1'st bokmärkta inlägg", "account/settings": "Avnändarinställningar", "account/watched": "Ämnen som bevakas av %1", - "account/ignored": "Topics ignored by %1", + "account/ignored": "Ämnen som %1 ignorerar", "account/upvoted": "Inlägg som röstats upp av %1", "account/downvoted": "Inlägg som röstats ned av %1", "account/best": "Bästa inläggen skapade av %1", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", + "account/blocks": "Blockerade användare för %1", + "account/uploads": "Uppladdningar av %1", "confirm": "E-postadress bekräftad", "maintenance.text": "%1 genomgår underhåll just nu. Vänligen kom tillbaka lite senare.", "maintenance.messageIntro": "Utöver det så lämnade administratören följande meddelande:", diff --git a/public/language/sv/register.json b/public/language/sv/register.json index 1d8c404307..d1a795f939 100644 --- a/public/language/sv/register.json +++ b/public/language/sv/register.json @@ -20,7 +20,7 @@ "registration-added-to-queue": "Din registrering har lagts till i kön. Du kommer att få ett mail när den accepteras av en administratör.", "interstitial.intro": "Vi kräver ytterligare information innan vi kan skapa ditt konto.", "interstitial.errors-found": "Vi kunde inte slutföra din registrering:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "Jag ger detta forum mitt medgivande att samla in och behandla min personliga information.", + "gdpr_agree_email": "Jag går med på att få sammanfattnignar och notiser från detta forum via e-post.", + "gdpr_consent_denied": "Du måste ge ditt medgivande för att detta forum ska kunna samla in och behandla din information, samt skicka dig e-post." } \ No newline at end of file diff --git a/public/language/sv/search.json b/public/language/sv/search.json index f10767f346..ee193d7614 100644 --- a/public/language/sv/search.json +++ b/public/language/sv/search.json @@ -5,17 +5,17 @@ "in": "i", "titles": "Ämnen", "titles-posts": "Ämnen och inlägg", - "match-words": "Match words", - "all": "All", - "any": "Any", + "match-words": "Matcha ord", + "all": "Alla", + "any": "Någon", "posted-by": "Skapad av", "in-categories": "I kategorier", "search-child-categories": "Sök i underkategorier", - "has-tags": "Has tags", + "has-tags": "Har taggar", "reply-count": "Svarsantal", "at-least": "Som minst", "at-most": "Som mest", - "relevance": "Relevance", + "relevance": "Relevans", "post-time": "Inläggstid", "newer-than": "Yngre än", "older-than": "Äldre än", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index cd74d52542..181f52bc3d 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -13,9 +13,9 @@ "notify_me": "Få notiser om nya svar i detta ämne", "quote": "Citera", "reply": "Svara", - "replies_to_this_post": "%1 Replies", - "one_reply_to_this_post": "1 Reply", - "last_reply_time": "Last reply", + "replies_to_this_post": "%1 svar", + "one_reply_to_this_post": "Ett svar", + "last_reply_time": "Senaste svaret", "reply-as-topic": "Svara som ämne", "guest-login-reply": "Logga in för att posta", "edit": "Ändra", @@ -30,12 +30,12 @@ "locked": "Låst", "pinned": "Fäst", "moved": "Flyttad", - "copy-ip": "Copy IP", - "ban-ip": "Ban IP", - "view-history": "Edit History", + "copy-ip": "Kopiera IP", + "ban-ip": "Banna IP", + "view-history": "Redigera historik", "bookmark_instructions": "Klicka här för att återgå till senast lästa inlägg i detta ämne.", "flag_title": "Rapportera detta inlägg för granskning", - "merged_message": "This topic has been merged into %2", + "merged_message": "Detta ämne har sammanslagits med %2", "deleted_message": "Det här ämnet har raderats. Endast användare med ämneshanterings-privilegier kan se det.", "following_topic.message": "Du kommer nu få notiser när någon gör inlägg i detta ämne.", "not_following_topic.message": "Du kommer att se det här ämnet i listan olästa ämnen, men du kommer inte att få meddelande när någon gör inlägg till detta ämne.", @@ -56,15 +56,15 @@ "not-watching.description": "Meddela mig inte om nya svar.
Visa ämne i oläst ifall kategorin är ignorerad.", "ignoring.description": "Meddela mig inte om nya svar.
Visa inte ämne i oläst.", "thread_tools.title": "Ämnesverktyg", - "thread_tools.markAsUnreadForAll": "Mark Unread For All", + "thread_tools.markAsUnreadForAll": "Markera oläst för alla", "thread_tools.pin": "Nåla fast ämne", "thread_tools.unpin": "Lösgör ämne", "thread_tools.lock": "Lås ämne", "thread_tools.unlock": "Lås upp ämne", "thread_tools.move": "Flytta ämne", - "thread_tools.move-posts": "Move Posts", + "thread_tools.move-posts": "Flytta inlägg", "thread_tools.move_all": "Flytta alla", - "thread_tools.select_category": "Select Category", + "thread_tools.select_category": "Välj kategori", "thread_tools.fork": "Grena ämne", "thread_tools.delete": "Ta bort ämne", "thread_tools.delete-posts": "Radera inlägg", @@ -118,16 +118,16 @@ "sort_by": "Sortera på", "oldest_to_newest": "Äldst till nyaste", "newest_to_oldest": "Nyaste till äldst", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "Flest röster", + "most_posts": "Flest inlägg", "stale.title": "Skapa nytt ämne istället?", "stale.warning": "Ämnet du svarar på är ganska gammalt. Vill du skapa ett nytt ämne istället och inkludera en referens till det här ämnet i ditt inlägg?", "stale.create": "Skapa nytt ämne", "stale.reply_anyway": "Svara på ämnet ändå", "link_back": "Re: [%1](%2)", - "diffs.title": "Post Edit History", - "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", - "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.title": "Redigeringshistorik för post", + "diffs.description": "Detta inlägg har %1 revisioner. Klicka på en av revisionerna nedan för att se det dåvarande innehållet i inlägget.", + "diffs.no-revisions-description": "Detta inlägg har %1 revisioner.", + "diffs.current-revision": "Nuvarande revision", + "diffs.original-revision": "Ursprunglig revision" } \ No newline at end of file diff --git a/public/language/sv/unread.json b/public/language/sv/unread.json index aa01180c97..9b529c7249 100644 --- a/public/language/sv/unread.json +++ b/public/language/sv/unread.json @@ -10,6 +10,6 @@ "all-topics": "Alla ämnen", "new-topics": "Nya ämnen", "watched-topics": "Bevakade ämnen", - "unreplied-topics": "Unreplied Topics", - "multiple-categories-selected": "Multiple Selected" + "unreplied-topics": "Obesvarade ämnen", + "multiple-categories-selected": "Flera valda" } \ No newline at end of file diff --git a/public/language/sv/uploads.json b/public/language/sv/uploads.json index f94d1acf0c..96a34f1ab8 100644 --- a/public/language/sv/uploads.json +++ b/public/language/sv/uploads.json @@ -3,7 +3,7 @@ "select-file-to-upload": "Välj en fil att ladda upp!", "upload-success": "Filen laddades upp!", "maximum-file-size": "Maximalt %1 kb", - "no-uploads-found": "No uploads found", - "public-uploads-info": "Uploads are public, all visitors can see them.", - "private-uploads-info": "Uploads are private, only logged in users can see them." + "no-uploads-found": "Inga uppladdningar funna", + "public-uploads-info": "Uppladdningar är publikt tillgängliga, alla forumbesökare kan se dem.", + "private-uploads-info": "Uppladdningar är privata, endast inloggade användare kan se dem." } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index 1bad4271c1..433af55a7d 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -26,20 +26,20 @@ "reputation": "Rykte", "bookmarks": "Bokmärken", "watched": "Bevakad", - "ignored": "Ignored", + "ignored": "Ignorerad", "followers": "Följare", "following": "Följer", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "Blockerar", + "block_toggle": "Ändra blockeringsinställning", + "block_user": "Blockera användare", + "unblock_user": "Sluta blockera användare", "aboutme": "Om mig", "signature": "Signatur", "birthday": "Födelsedag", "chat": "Chatta", - "chat_with": "Continue chat with %1", - "new_chat_with": "Start new chat with %1", - "flag-profile": "Flag Profile", + "chat_with": "Fortsätt chatt med %1", + "new_chat_with": "Påbörja ny chatt med %1", + "flag-profile": "Flagga profil", "follow": "Följ", "unfollow": "Sluta följ", "more": "Mer", @@ -65,14 +65,14 @@ "username_taken_workaround": "Användarnamnet är redan upptaget, så vi förändrade det lite. Du kallas nu för %1", "password_same_as_username": "Ditt lösenord är samma som ditt användarnamn, välj ett annat lösenord.", "password_same_as_email": "Ditt lösenord är detsamma som din e-postadress. Var god välj ett annat lösenord.", - "weak_password": "Weak password.", + "weak_password": "Svagt lösenord", "upload_picture": "Ladda upp bild", "upload_a_picture": "Ladda upp en bild", "remove_uploaded_picture": "Ta bort uppladdad bild", "upload_cover_picture": "Ladda upp omslagsbild", - "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_cover_picture_confirm": "Är du säker att du vill radera profilbilden?", + "crop_picture": "Beskär bild", + "upload_cropped_picture": "Beskär och ladda upp", "settings": "Inställningar", "show_email": "Visa min e-postadress", "show_fullname": "Visa fullständigt namn", @@ -89,31 +89,31 @@ "has_no_posts": "Användaren har inte skrivit några inlägg ännu.", "has_no_topics": "Användaren har inte postat några ämnen ännu.", "has_no_watched_topics": "Användaren har inte bevakat några ämnen ännu.", - "has_no_ignored_topics": "This user hasn't ignored any topics yet.", + "has_no_ignored_topics": "Denna användare ignorerar inte några ämnen ännu.", "has_no_upvoted_posts": "Den här användaren har inte röstat upp några inlägg än.", "has_no_downvoted_posts": "Den här användaren har inte röstat ned några inlägg än.", "has_no_voted_posts": "Den här användaren har inga inlägg med röster", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "Du har inte blockerat några användare.", "email_hidden": "E-post dold", "hidden": "dold", "paginate_description": "Gör så att ämnen och inlägg visas som sidor istället för oändlig skroll", "topics_per_page": "Ämnen per sida", "posts_per_page": "Inlägg per sida", - "max_items_per_page": "Maximum %1", - "acp_language": "Admin Page Language", + "max_items_per_page": "Maximalt %1", + "acp_language": "Språk för administratorsida", "notification_sounds": "Spela ett ljud när du får en notis", "notifications_and_sounds": "Meddelanden och ljud", "incoming-message-sound": "Inkommande meddelande ljud", "outgoing-message-sound": "Utgående meddelande ljud", "notification-sound": "Meddelandeljud", "no-sound": "Inget ljud", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.first": "First Per Post", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "Notisfrekvens för uppröstningar", + "upvote-notif-freq.all": "Alla uppröstningar", + "upvote-notif-freq.first": "Första per post", + "upvote-notif-freq.everyTen": "Var tionde post", + "upvote-notif-freq.threshold": "Varje 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.logarithmic": "Varje 10, 100, 1000...", + "upvote-notif-freq.disabled": "Avstängd", "browsing": "Inställning för bläddring", "open_links_in_new_tab": "Öppna utgående länkar i ny flik", "enable_topic_searching": "Aktivera sökning inom ämne", @@ -134,9 +134,9 @@ "sso.title": "Single Sign-on-tjänster", "sso.associated": "Associerad med", "sso.not-associated": "Klicka här för att associera med", - "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": "Frånkoppla", + "sso.dissociate-confirm-title": "Bekräfta frånkoppling", + "sso.dissociate-confirm": "Är du säker att du vill koppla bort ditt konto från %1?", "info.latest-flags": "Senaste flaggade", "info.no-flags": "Inga flaggade inlägg hittades", "info.ban-history": "Ban historik", @@ -149,25 +149,25 @@ "info.email-history": "Epost historik", "info.moderation-note": "Moderations anteckning", "info.moderation-note.success": "Moderations anteckning sparad", - "info.moderation-note.add": "Add note", - "consent.title": "Your Rights & Consent", - "consent.lead": "This community forum collects and processes your personal information.", - "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", - "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", - "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", - "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", - "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", - "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", - "consent.give": "Give consent", - "consent.right_of_access": "You have the Right of Access", - "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", - "consent.right_to_rectification": "You have the Right to Rectification", - "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", - "consent.right_to_erasure": "You have the Right to Erasure", - "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", - "consent.export_profile": "Export Profile (.csv)", - "consent.export_uploads": "Export Uploaded Content (.zip)", - "consent.export_posts": "Export Posts (.csv)" + "info.moderation-note.add": "Lägg till anteckning", + "consent.title": "Dina rättigheter och Medgivande", + "consent.lead": "Detta forum samlar och behandlar din personliga information.", + "consent.intro": "Vi använder denna information endast i syfte att personligt anpassa din upplevelse i denna gemenskap, och för att associera de inlägg du gör till ditt användarkonto. När du registrerade dig blev du ombedd att ange ett användarnamn och en e-postadress, du kan även frivilligt ange ytterligare infromation för att komplettera din användarprofil på denna webbsida.

Vi sparar denna information så länge som du har ett konto hos oss, och du kan dra tillbaks ditt medgivande när som helst genom att radera ditt konto. Du kan är som helst efterfråga en kopia av din information på denna webbplats, genom sidan Rättigheter och Medgivande.

Om du har några frågor eller funderingar rekommenderar vi att du tar kontakt med detta forums administrativa team.", + "consent.email_intro": "Vi kan då och då skicka e-post till din registrerade e-postadress för att meddela om uppdateringar och/eller informera dig om ny aktivitet som är relevant för dig. Du kan ändra hur ofta vi skickar forumsammanfattningar (eller stänga av det helt), och ändra vilka sorters uppdateringar du vill få genom dina användarinställningar.", + "consent.digest_frequency": "Såvida du inte ändrat detta i dina användarinställningar, skickar detta forum e-postsammanfattningar varje %1", + "consent.digest_off": "Såvida du inte ändrat detta i dina användarinställningar, skickar detta forum inte ut e-postsammanfattningar", + "consent.received": "Du har givit denna webbsida medgivande att samla in och behandla din information. Inga ytterligare handlingar krävs.", + "consent.not_received": "Du har inte givit medgivande för datainsamling och -behandling. Denna webbsidas administration kan närsomhelst besluta att radera ditt konto för att uppfylla GDPR.", + "consent.give": "Ge medgivande", + "consent.right_of_access": "Du har rätten till tillgång", + "consent.right_of_access_description": "Du har rätten att hämta all data denna webbsida samlar om dig när som helst. Du han hämta en kopia av denna data genom att trycka på knappen nedan.", + "consent.right_to_rectification": "Du har rätten till rättelse", + "consent.right_to_rectification_description": "Du har rätt att ändra eller uppdatera all inkorrekt data som du har givit oss. Din profil kan uppdateras genom att ändra din profil, och innehåll i poster kan alltid redigeras. Om detta inte skulle vara fallet, vänligen kontakta detta forums administrativa team.", + "consent.right_to_erasure": "Du har rätt till borttagning", + "consent.right_to_erasure_description": "Du kan när som helst ta tillbaka ditt medgivande till datainsamling och/eller behandling genom att radera ditt konto. Din individuella profil kan raderas, men innehåll du lagt upp kommer bestå. Om du vill radera både din profiloch ditt innehåll, vänligen kontakta detta forums administrativa team.", + "consent.right_to_data_portability": "Du har rätten till dataförflyttbarhet", + "consent.right_to_data_portability_description": "Du kan hämta en maskinläslig export av all insamlad data om dig och ditt konto. Du kan göra det genom att klicka på passande knapp nedan.", + "consent.export_profile": "Exportera profil (.csv)", + "consent.export_uploads": "Exportera uppladdat innehåll (.zip)", + "consent.export_posts": "Exportera poster (.csv)" } \ No newline at end of file From 4027abcd588123476e6035c54a942e12316e642a Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 6 Aug 2018 09:29:32 +0000 Subject: [PATCH 084/310] Latest translations and fallbacks --- public/language/ru/admin/development/logger.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/ru/admin/development/logger.json b/public/language/ru/admin/development/logger.json index 3e363c5807..3de1a58cb0 100644 --- a/public/language/ru/admin/development/logger.json +++ b/public/language/ru/admin/development/logger.json @@ -1,12 +1,12 @@ { - "logger-settings": "Logger Settings", + "logger-settings": "Настройки логгера", "description": "Включив чек-боксы, вы получите логи на свой терминал. Если вы укажете путь, логи будут сохранены в файле. Протокол HTTP полезен для сбора статистики о том, кто, когда и где посетители получают на вашем форуме. Помимо регистрации HTTP-запросов, мы также можем регистрировать события socket.io. Регистрация Socket.io в сочетании с монитором redis-cli может быть очень полезна для исследования внутреннего состояния NodeBB.", "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", "enable-http": "Включить HTTP логирование", - "enable-socket": "Enable socket.io event logging", + "enable-socket": "Включить логирование событий socket.io", "file-path": "Путь до файла логов", "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", - "control-panel": "Logger Control Panel", - "update-settings": "Update Logger Settings" + "control-panel": "Контрольная панель логгера", + "update-settings": "Применить настройки логгера" } \ No newline at end of file From 3cccbbc1f2229b7da793acce87ab9f7adb41ab74 Mon Sep 17 00:00:00 2001 From: Jimb Esser Date: Mon, 6 Aug 2018 18:24:57 -0700 Subject: [PATCH 085/310] Add option to enable/disable HSTS Also fix HSTS middleware being added twice. --- public/language/en-GB/admin/settings/advanced.json | 3 ++- src/views/admin/settings/advanced.tpl | 6 ++++++ src/webserver.js | 12 +++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/public/language/en-GB/admin/settings/advanced.json b/public/language/en-GB/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/en-GB/admin/settings/advanced.json +++ b/public/language/en-GB/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/src/views/admin/settings/advanced.tpl b/src/views/admin/settings/advanced.tpl index 44d34fa80f..4aec0e51fa 100644 --- a/src/views/admin/settings/advanced.tpl +++ b/src/views/admin/settings/advanced.tpl @@ -67,6 +67,12 @@
[[admin/settings/advanced:hsts]]
+
+ +

diff --git a/src/webserver.js b/src/webserver.js index 86a84a1459..b201fd4915 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -185,13 +185,19 @@ function setupExpressApp(app, callback) { saveUninitialized: true, })); - app.use(helmet()); - app.use(helmet.referrerPolicy({ policy: 'strict-origin-when-cross-origin' })); - app.use(helmet.hsts({ + var hsts_option = { maxAge: parseInt(meta.config['hsts-maxage'], 10) || 31536000, includeSubdomains: !!parseInt(meta.config['hsts-subdomains'], 10), preload: !!parseInt(meta.config['hsts-preload'], 10), + setIf: function () { + // If not set, default to on - previous and recommended behavior + return meta.config['hsts-enabled'] === undefined || !!parseInt(meta.config['hsts-enabled'], 10); + }, + }; + app.use(helmet({ + hsts: hsts_option, })); + app.use(helmet.referrerPolicy({ policy: 'strict-origin-when-cross-origin' })); app.use(middleware.addHeaders); app.use(middleware.processRender); auth.initialize(app, middleware); From 33228bb7fed6c449efbebde26deffed43cb12a14 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Wed, 8 Aug 2018 14:13:48 -0500 Subject: [PATCH 086/310] PostgreSQL database driver (#5861) * [test/database/list] Fix test list 4 being used in two different tests * [database/postgres] PostgreSQL database driver * [database/postgres] Make transactions work based on continuation scope. * [database/postgres] Implement nested transactions * eslint --fix * Add database changes from earlier this week to the PostgreSQL driver. * Fix typo * Fix postgres.incrObjectFieldBy returning undefined instead of null when given NaN * [database/postgres] Fix sortedSetsCard returning an array of strings. * Update socket.io postgres adapter * Fix PostgreSQL erroring when multiple updates are made to the same sorted set entry in a single operation. Add a test case to catch this error. * Fix lint errors. * Only prune sessions on one instance in a cluster to avoid deadlocks. They're caught and handled by the database server, but they spam the logs. * Fix arguments.slice. --- .eslintrc | 4 + .travis.yml | 4 + install/databases.js | 17 +- install/package.json | 7 +- install/web.js | 2 +- .../en-GB/admin/advanced/database.json | 8 +- src/controllers/admin/database.js | 8 + src/database/mongo.js | 1 + src/database/mongo/transaction.js | 8 + src/database/postgres.js | 452 +++++++++++ src/database/postgres/hash.js | 391 +++++++++ src/database/postgres/helpers.js | 139 ++++ src/database/postgres/list.js | 234 ++++++ src/database/postgres/main.js | 239 ++++++ src/database/postgres/pubsub.js | 51 ++ src/database/postgres/sets.js | 342 ++++++++ src/database/postgres/sorted.js | 744 ++++++++++++++++++ src/database/postgres/sorted/add.js | 108 +++ src/database/postgres/sorted/intersect.js | 105 +++ src/database/postgres/sorted/remove.js | 83 ++ src/database/postgres/sorted/union.js | 97 +++ src/database/postgres/transaction.js | 50 ++ src/database/redis.js | 1 + src/database/redis/transaction.js | 8 + src/install.js | 3 +- src/pubsub.js | 2 + src/upgrades/1.4.6/delete_sessions.js | 4 +- src/views/admin/advanced/database.tpl | 27 + src/views/install/index.tpl | 1 + test/controllers-admin.js | 2 + test/database.js | 5 + test/database/list.js | 6 +- test/database/sorted.js | 15 + test/mocks/databasemock.js | 8 + 34 files changed, 3166 insertions(+), 10 deletions(-) create mode 100644 src/database/mongo/transaction.js create mode 100644 src/database/postgres.js create mode 100644 src/database/postgres/hash.js create mode 100644 src/database/postgres/helpers.js create mode 100644 src/database/postgres/list.js create mode 100644 src/database/postgres/main.js create mode 100644 src/database/postgres/pubsub.js create mode 100644 src/database/postgres/sets.js create mode 100644 src/database/postgres/sorted.js create mode 100644 src/database/postgres/sorted/add.js create mode 100644 src/database/postgres/sorted/intersect.js create mode 100644 src/database/postgres/sorted/remove.js create mode 100644 src/database/postgres/sorted/union.js create mode 100644 src/database/postgres/transaction.js create mode 100644 src/database/redis/transaction.js diff --git a/.eslintrc b/.eslintrc index ef9f48dedc..9414543335 100644 --- a/.eslintrc +++ b/.eslintrc @@ -36,6 +36,10 @@ "no-restricted-globals": "off", "function-paren-newline": "off", "import/no-unresolved": "error", + "quotes": ["error", "single", { + "avoidEscape": true, + "allowTemplateLiterals": true + }], // ES6 "prefer-rest-params": "off", diff --git a/.travis.yml b/.travis.yml index b41e65cca7..0831d9d8d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,14 @@ services: - mongodb - redis-server + - postgresql before_install: - cp install/package.json package.json before_script: - sleep 15 # wait for mongodb to be ready - sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":0}\"; fi" - sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":0}\"; fi" + - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database nodebb;' -U postgres; psql -c 'create database travis_ci_test;' -U postgres; node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"postgres\\\",\\\"postgres:host\\\":\\\"127.0.0.1\\\",\\\"postgres:port\\\":5432,\\\"postgres:password\\\":\\\"\\\",\\\"postgres:database\\\":\\\"nodebb\\\",\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":5432,\\\"username\\\":\\\"postgres\\\",\\\"database\\\":\\\"travis_ci_test\\\"}\"; fi" after_success: - "npm run coveralls" language: node_js @@ -15,6 +17,7 @@ dist: trusty env: - CXX=g++-4.8 DB=mongodb - CXX=g++-4.8 DB=redis + - CXX=g++-4.8 DB=postgres addons: apt: sources: @@ -23,6 +26,7 @@ addons: packages: - g++-4.8 - mongodb-org-server + postgresql: "9.5" node_js: - "10" - "8" diff --git a/install/databases.js b/install/databases.js index 430a40e04d..45de648cb0 100644 --- a/install/databases.js +++ b/install/databases.js @@ -7,6 +7,7 @@ var winston = require('winston'); var questions = { redis: require('../src/database/redis').questions, mongo: require('../src/database/mongo').questions, + postgres: require('../src/database/postgres').questions, }; module.exports = function (config, callback) { @@ -38,6 +39,12 @@ function getDatabaseConfig(config, callback) { } else { prompt.get(questions.mongo, callback); } + } else if (config.database === 'postgres') { + if (config['postgres:host'] && config['postgres:port']) { + callback(null, config); + } else { + prompt.get(questions.postgres, callback); + } } else { return callback(new Error('unknown database : ' + config.database)); } @@ -69,11 +76,19 @@ function saveDatabaseConfig(config, databaseConfig, callback) { database: databaseConfig['mongo:database'], uri: databaseConfig['mongo:uri'], }; + } else if (config.database === 'postgres') { + config.postgres = { + host: databaseConfig['postgres:host'], + port: databaseConfig['postgres:port'], + username: databaseConfig['postgres:username'], + password: databaseConfig['postgres:password'], + database: databaseConfig['postgres:database'], + }; } else { return callback(new Error('unknown database : ' + config.database)); } - var allQuestions = questions.redis.concat(questions.mongo); + var allQuestions = questions.redis.concat(questions.mongo).concat(questions.postgres); for (var x = 0; x < allQuestions.length; x += 1) { delete config[allQuestions[x].name]; } diff --git a/install/package.json b/install/package.json index 341ef67c90..f9b0ec9e95 100644 --- a/install/package.json +++ b/install/package.json @@ -29,13 +29,15 @@ "cli-graph": "^3.2.2", "clipboard": "^2.0.1", "colors": "^1.1.2", - "compression": "^1.7.1", "commander": "^2.12.2", + "compression": "^1.7.1", "connect-ensure-login": "^0.1.1", "connect-flash": "^0.1.1", "connect-mongo": "2.0.1", "connect-multiparty": "^2.1.0", + "connect-pg-simple": "^4.2.1", "connect-redis": "3.3.3", + "continuation-local-storage": "^3.2.1", "cookie-parser": "^1.4.3", "cron": "^1.3.0", "cropperjs": "^1.2.2", @@ -82,6 +84,8 @@ "nodemailer": "^4.6.5", "passport": "^0.4.0", "passport-local": "1.0.0", + "pg": "^7.4.0", + "pg-cursor": "^1.3.0", "postcss": "7.0.2", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", @@ -97,6 +101,7 @@ "socket.io": "2.1.1", "socket.io-adapter-cluster": "^1.0.1", "socket.io-adapter-mongo": "^2.0.1", + "socket.io-adapter-postgres": "^1.0.1", "socket.io-client": "2.1.1", "socket.io-redis": "5.2.0", "socketio-wildcard": "2.0.0", diff --git a/install/web.js b/install/web.js index 2f0ef39a42..8ebf0fb641 100644 --- a/install/web.js +++ b/install/web.js @@ -90,7 +90,7 @@ function ping(req, res) { } function welcome(req, res) { - var dbs = ['redis', 'mongo']; + var dbs = ['redis', 'mongo', 'postgres']; var databases = dbs.map(function (databaseName) { var questions = require('../src/database/' + databaseName).questions.filter(function (question) { return question && !question.hideOnWebInstall; diff --git a/public/language/en-GB/admin/advanced/database.json b/public/language/en-GB/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/en-GB/admin/advanced/database.json +++ b/public/language/en-GB/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/src/controllers/admin/database.js b/src/controllers/admin/database.js index efec771ee6..147747822c 100644 --- a/src/controllers/admin/database.js +++ b/src/controllers/admin/database.js @@ -25,6 +25,14 @@ databaseController.get = function (req, res, next) { next(); } }, + postgres: function (next) { + if (nconf.get('postgres')) { + var pdb = require('../../database/postgres'); + pdb.info(pdb.pool, next); + } else { + next(); + } + }, }, next); }, function (results) { diff --git a/src/database/mongo.js b/src/database/mongo.js index 5b264253f5..8c9cd8e0fa 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -126,6 +126,7 @@ mongoModule.init = function (callback) { require('./mongo/sets')(db, mongoModule); require('./mongo/sorted')(db, mongoModule); require('./mongo/list')(db, mongoModule); + require('./mongo/transaction')(db, mongoModule); callback(); }); }; diff --git a/src/database/mongo/transaction.js b/src/database/mongo/transaction.js new file mode 100644 index 0000000000..75ea5fbaa2 --- /dev/null +++ b/src/database/mongo/transaction.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = function (db, module) { + // TODO + module.transaction = function (perform, callback) { + perform(db, callback); + }; +}; diff --git a/src/database/postgres.js b/src/database/postgres.js new file mode 100644 index 0000000000..8cd4f97d42 --- /dev/null +++ b/src/database/postgres.js @@ -0,0 +1,452 @@ +'use strict'; + +var winston = require('winston'); +var async = require('async'); +var nconf = require('nconf'); +var session = require('express-session'); +var _ = require('lodash'); +var semver = require('semver'); +var dbNamespace = require('continuation-local-storage').createNamespace('postgres'); +var db; + +var postgresModule = module.exports; + +postgresModule.questions = [ + { + name: 'postgres:host', + description: 'Host IP or address of your PostgreSQL instance', + default: nconf.get('postgres:host') || '127.0.0.1', + }, + { + name: 'postgres:port', + description: 'Host port of your PostgreSQL instance', + default: nconf.get('postgres:port') || 5432, + }, + { + name: 'postgres:username', + description: 'PostgreSQL username', + default: nconf.get('postgres:username') || '', + }, + { + name: 'postgres:password', + description: 'Password of your PostgreSQL database', + hidden: true, + default: nconf.get('postgres:password') || '', + before: function (value) { value = value || nconf.get('postgres:password') || ''; return value; }, + }, + { + name: 'postgres:database', + description: 'PostgreSQL database name', + default: nconf.get('postgres:database') || 'nodebb', + }, +]; + +postgresModule.helpers = postgresModule.helpers || {}; +postgresModule.helpers.postgres = require('./postgres/helpers'); + +postgresModule.getConnectionOptions = function () { + // Sensible defaults for PostgreSQL, if not set + if (!nconf.get('postgres:host')) { + nconf.set('postgres:host', '127.0.0.1'); + } + if (!nconf.get('postgres:port')) { + nconf.set('postgres:port', 5432); + } + if (!nconf.get('postgres:database')) { + nconf.set('postgres:database', 'nodebb'); + } + + var connOptions = { + host: nconf.get('postgres:host'), + port: nconf.get('postgres:port'), + user: nconf.get('postgres:username'), + password: nconf.get('postgres:password'), + database: nconf.get('postgres:database'), + }; + + return _.merge(connOptions, nconf.get('postgres:options') || {}); +}; + +postgresModule.init = function (callback) { + callback = callback || function () { }; + + var Pool = require('pg').Pool; + + var connOptions = postgresModule.getConnectionOptions(); + + db = new Pool(connOptions); + + db.on('connect', function (client) { + var realQuery = client.query; + client.query = function () { + var args = Array.prototype.slice.call(arguments, 0); + if (dbNamespace.active && typeof args[args.length - 1] === 'function') { + args[args.length - 1] = dbNamespace.bind(args[args.length - 1]); + } + return realQuery.apply(client, args); + }; + }); + + db.connect(function (err, client, release) { + if (err) { + winston.error('NodeBB could not connect to your PostgreSQL database. PostgreSQL returned the following error: ' + err.message); + return callback(err); + } + + postgresModule.pool = db; + Object.defineProperty(postgresModule, 'client', { + get: function () { + return (dbNamespace.active && dbNamespace.get('db')) || db; + }, + configurable: true, + }); + + var wrappedDB = { + connect: function () { + return postgresModule.pool.connect.apply(postgresModule.pool, arguments); + }, + query: function () { + return postgresModule.client.query.apply(postgresModule.client, arguments); + }, + }; + + checkUpgrade(client, function (err) { + release(); + if (err) { + return callback(err); + } + + require('./postgres/main')(wrappedDB, postgresModule); + require('./postgres/hash')(wrappedDB, postgresModule); + require('./postgres/sets')(wrappedDB, postgresModule); + require('./postgres/sorted')(wrappedDB, postgresModule); + require('./postgres/list')(wrappedDB, postgresModule); + require('./postgres/transaction')(db, dbNamespace, postgresModule); + + callback(); + }); + }); +}; + +function checkUpgrade(client, callback) { + client.query(` +SELECT EXISTS(SELECT * + FROM "information_schema"."columns" + WHERE "table_schema" = 'public' + AND "table_name" = 'objects' + AND "column_name" = 'data') a, + EXISTS(SELECT * + FROM "information_schema"."columns" + WHERE "table_schema" = 'public' + AND "table_name" = 'legacy_hash' + AND "column_name" = '_key') b`, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows[0].b) { + return callback(null); + } + + var query = client.query.bind(client); + + async.series([ + async.apply(query, `BEGIN`), + async.apply(query, ` +CREATE TYPE LEGACY_OBJECT_TYPE AS ENUM ( + 'hash', 'zset', 'set', 'list', 'string' +)`), + async.apply(query, ` +CREATE TABLE "legacy_object" ( + "_key" TEXT NOT NULL + PRIMARY KEY, + "type" LEGACY_OBJECT_TYPE NOT NULL, + "expireAt" TIMESTAMPTZ DEFAULT NULL, + UNIQUE ( "_key", "type" ) +)`), + async.apply(query, ` +CREATE TABLE "legacy_hash" ( + "_key" TEXT NOT NULL + PRIMARY KEY, + "data" JSONB NOT NULL, + "type" LEGACY_OBJECT_TYPE NOT NULL + DEFAULT 'hash'::LEGACY_OBJECT_TYPE + CHECK ( "type" = 'hash' ), + CONSTRAINT "fk__legacy_hash__key" + FOREIGN KEY ("_key", "type") + REFERENCES "legacy_object"("_key", "type") + ON UPDATE CASCADE + ON DELETE CASCADE +)`), + async.apply(query, ` +CREATE TABLE "legacy_zset" ( + "_key" TEXT NOT NULL, + "value" TEXT NOT NULL, + "score" NUMERIC NOT NULL, + "type" LEGACY_OBJECT_TYPE NOT NULL + DEFAULT 'zset'::LEGACY_OBJECT_TYPE + CHECK ( "type" = 'zset' ), + PRIMARY KEY ("_key", "value"), + CONSTRAINT "fk__legacy_zset__key" + FOREIGN KEY ("_key", "type") + REFERENCES "legacy_object"("_key", "type") + ON UPDATE CASCADE + ON DELETE CASCADE +)`), + async.apply(query, ` +CREATE TABLE "legacy_set" ( + "_key" TEXT NOT NULL, + "member" TEXT NOT NULL, + "type" LEGACY_OBJECT_TYPE NOT NULL + DEFAULT 'set'::LEGACY_OBJECT_TYPE + CHECK ( "type" = 'set' ), + PRIMARY KEY ("_key", "member"), + CONSTRAINT "fk__legacy_set__key" + FOREIGN KEY ("_key", "type") + REFERENCES "legacy_object"("_key", "type") + ON UPDATE CASCADE + ON DELETE CASCADE +)`), + async.apply(query, ` +CREATE TABLE "legacy_list" ( + "_key" TEXT NOT NULL + PRIMARY KEY, + "array" TEXT[] NOT NULL, + "type" LEGACY_OBJECT_TYPE NOT NULL + DEFAULT 'list'::LEGACY_OBJECT_TYPE + CHECK ( "type" = 'list' ), + CONSTRAINT "fk__legacy_list__key" + FOREIGN KEY ("_key", "type") + REFERENCES "legacy_object"("_key", "type") + ON UPDATE CASCADE + ON DELETE CASCADE +)`), + async.apply(query, ` +CREATE TABLE "legacy_string" ( + "_key" TEXT NOT NULL + PRIMARY KEY, + "data" TEXT NOT NULL, + "type" LEGACY_OBJECT_TYPE NOT NULL + DEFAULT 'string'::LEGACY_OBJECT_TYPE + CHECK ( "type" = 'string' ), + CONSTRAINT "fk__legacy_string__key" + FOREIGN KEY ("_key", "type") + REFERENCES "legacy_object"("_key", "type") + ON UPDATE CASCADE + ON DELETE CASCADE +)`), + function (next) { + if (!res.rows[0].a) { + return next(); + } + async.series([ + async.apply(query, ` +INSERT INTO "legacy_object" ("_key", "type", "expireAt") +SELECT DISTINCT "data"->>'_key', + CASE WHEN (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 2 + THEN CASE WHEN ("data" ? 'value') + OR ("data" ? 'data') + THEN 'string' + WHEN "data" ? 'array' + THEN 'list' + WHEN "data" ? 'members' + THEN 'set' + ELSE 'hash' + END + WHEN (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 3 + THEN CASE WHEN ("data" ? 'value') + AND ("data" ? 'score') + THEN 'zset' + ELSE 'hash' + END + ELSE 'hash' + END::LEGACY_OBJECT_TYPE, + CASE WHEN ("data" ? 'expireAt') + THEN to_timestamp(("data"->>'expireAt')::double precision / 1000) + ELSE NULL + END + FROM "objects"`), + async.apply(query, ` +INSERT INTO "legacy_hash" ("_key", "data") +SELECT "data"->>'_key', + "data" - '_key' - 'expireAt' + FROM "objects" + WHERE CASE WHEN (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 2 + THEN NOT (("data" ? 'value') + OR ("data" ? 'data') + OR ("data" ? 'members') + OR ("data" ? 'array')) + WHEN (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 3 + THEN NOT (("data" ? 'value') + AND ("data" ? 'score')) + ELSE TRUE + END`), + async.apply(query, ` +INSERT INTO "legacy_zset" ("_key", "value", "score") +SELECT "data"->>'_key', + "data"->>'value', + ("data"->>'score')::NUMERIC + FROM "objects" + WHERE (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 3 + AND ("data" ? 'value') + AND ("data" ? 'score')`), + async.apply(query, ` +INSERT INTO "legacy_set" ("_key", "member") +SELECT "data"->>'_key', + jsonb_array_elements_text("data"->'members') + FROM "objects" + WHERE (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 2 + AND ("data" ? 'members')`), + async.apply(query, ` +INSERT INTO "legacy_list" ("_key", "array") +SELECT "data"->>'_key', + ARRAY(SELECT t + FROM jsonb_array_elements_text("data"->'list') WITH ORDINALITY l(t, i) + ORDER BY i ASC) + FROM "objects" + WHERE (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 2 + AND ("data" ? 'array')`), + async.apply(query, ` +INSERT INTO "legacy_string" ("_key", "data") +SELECT "data"->>'_key', + CASE WHEN "data" ? 'value' + THEN "data"->>'value' + ELSE "data"->>'data' + END + FROM "objects" + WHERE (SELECT COUNT(*) + FROM jsonb_object_keys("data" - 'expireAt')) = 2 + AND (("data" ? 'value') + OR ("data" ? 'data'))`), + async.apply(query, `DROP TABLE "objects" CASCADE`), + async.apply(query, `DROP FUNCTION "fun__objects__expireAt"() CASCADE`), + ], next); + }, + async.apply(query, ` +CREATE VIEW "legacy_object_live" AS +SELECT "_key", "type" + FROM "legacy_object" + WHERE "expireAt" IS NULL + OR "expireAt" > CURRENT_TIMESTAMP`), + ], function (err) { + query(err ? `ROLLBACK` : `COMMIT`, function (err1) { + callback(err1 || err); + }); + }); + }); +} + +postgresModule.initSessionStore = function (callback) { + var meta = require('../meta'); + var sessionStore; + + var ttl = meta.getSessionTTLSeconds(); + + if (nconf.get('redis')) { + sessionStore = require('connect-redis')(session); + var rdb = require('./redis'); + rdb.client = rdb.connect(); + + postgresModule.sessionStore = new sessionStore({ + client: rdb.client, + ttl: ttl, + }); + + return callback(); + } + + db.query(` +CREATE TABLE IF NOT EXISTS "session" ( + "sid" VARCHAR NOT NULL + COLLATE "default", + "sess" JSON NOT NULL, + "expire" TIMESTAMP(6) NOT NULL, + CONSTRAINT "session_pkey" + PRIMARY KEY ("sid") + NOT DEFERRABLE + INITIALLY IMMEDIATE +) WITH (OIDS=FALSE)`, function (err) { + if (err) { + return callback(err); + } + + sessionStore = require('connect-pg-simple')(session); + postgresModule.sessionStore = new sessionStore({ + pool: db, + ttl: ttl, + pruneSessionInterval: nconf.get('isPrimary') === 'true' ? 60 : false, + }); + + callback(); + }); +}; + +postgresModule.createIndices = function (callback) { + if (!postgresModule.pool) { + winston.warn('[database/createIndices] database not initialized'); + return callback(); + } + + var query = postgresModule.pool.query.bind(postgresModule.pool); + + winston.info('[database] Checking database indices.'); + async.series([ + async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_zset__key__score" ON "legacy_zset"("_key" ASC, "score" DESC)`), + async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_object__expireAt" ON "legacy_object"("expireAt" ASC)`), + ], function (err) { + if (err) { + winston.error('Error creating index ' + err.message); + return callback(err); + } + winston.info('[database] Checking database indices done!'); + callback(); + }); +}; + +postgresModule.checkCompatibility = function (callback) { + var postgresPkg = require('pg/package.json'); + postgresModule.checkCompatibilityVersion(postgresPkg.version, callback); +}; + +postgresModule.checkCompatibilityVersion = function (version, callback) { + if (semver.lt(version, '7.0.0')) { + return callback(new Error('The `pg` package is out-of-date, please run `./nodebb setup` again.')); + } + + callback(); +}; + +postgresModule.info = function (db, callback) { + if (!db) { + return callback(); + } + + db.query(` +SELECT true "postgres", + current_setting('server_version') "version", + EXTRACT(EPOCH FROM NOW() - pg_postmaster_start_time()) * 1000 "uptime"`, function (err, res) { + if (err) { + return callback(err); + } + callback(null, res.rows[0]); + }); +}; + +postgresModule.close = function (callback) { + callback = callback || function () {}; + db.end(callback); +}; + +postgresModule.socketAdapter = function () { + var postgresAdapter = require('socket.io-adapter-postgres'); + return postgresAdapter(postgresModule.getConnectionOptions(), { + pubClient: postgresModule.pool, + }); +}; diff --git a/src/database/postgres/hash.js b/src/database/postgres/hash.js new file mode 100644 index 0000000000..aeb794185b --- /dev/null +++ b/src/database/postgres/hash.js @@ -0,0 +1,391 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + module.setObject = function (key, data, callback) { + callback = callback || helpers.noop; + + if (!key || !data) { + return callback(); + } + + if (data.hasOwnProperty('')) { + delete data['']; + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'hash'), + async.apply(query, { + name: 'setObject', + text: ` +INSERT INTO "legacy_hash" ("_key", "data") +VALUES ($1::TEXT, $2::TEXT::JSONB) + ON CONFLICT ("_key") + DO UPDATE SET "data" = "legacy_hash"."data" || $2::TEXT::JSONB`, + values: [key, JSON.stringify(data)], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.setObjectField = function (key, field, value, callback) { + callback = callback || helpers.noop; + + if (!field) { + return callback(); + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'hash'), + async.apply(query, { + name: 'setObjectField', + text: ` +INSERT INTO "legacy_hash" ("_key", "data") +VALUES ($1::TEXT, jsonb_build_object($2::TEXT, $3::TEXT::JSONB)) + ON CONFLICT ("_key") + DO UPDATE SET "data" = jsonb_set("legacy_hash"."data", ARRAY[$2::TEXT], $3::TEXT::JSONB)`, + values: [key, field, JSON.stringify(value)], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.getObject = function (key, callback) { + if (!key) { + return callback(); + } + + db.query({ + name: 'getObject', + text: ` +SELECT h."data" + FROM "legacy_object_live" o + INNER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + WHERE o."_key" = $1::TEXT + LIMIT 1`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].data); + } + + callback(null, null); + }); + }; + + module.getObjects = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + + db.query({ + name: 'getObjects', + text: ` +SELECT h."data" + FROM UNNEST($1::TEXT[]) WITH ORDINALITY k("_key", i) + LEFT OUTER JOIN "legacy_object_live" o + ON o."_key" = k."_key" + LEFT OUTER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + ORDER BY k.i ASC`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows.map(function (row) { + return row.data; + })); + }); + }; + + module.getObjectField = function (key, field, callback) { + if (!key) { + return callback(); + } + + db.query({ + name: 'getObjectField', + text: ` +SELECT h."data"->>$2::TEXT f + FROM "legacy_object_live" o + INNER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + WHERE o."_key" = $1::TEXT + LIMIT 1`, + values: [key, field], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].f); + } + + callback(null, null); + }); + }; + + module.getObjectFields = function (key, fields, callback) { + if (!key) { + return callback(); + } + + db.query({ + name: 'getObjectFields', + text: ` +SELECT (SELECT jsonb_object_agg(f, d."value") + FROM UNNEST($2::TEXT[]) f + LEFT OUTER JOIN jsonb_each(h."data") d + ON d."key" = f) d + FROM "legacy_object_live" o + INNER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + WHERE o."_key" = $1::TEXT`, + values: [key, fields], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].d); + } + + var obj = {}; + fields.forEach(function (f) { + obj[f] = null; + }); + + callback(null, obj); + }); + }; + + module.getObjectsFields = function (keys, fields, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + + db.query({ + name: 'getObjectsFields', + text: ` +SELECT (SELECT jsonb_object_agg(f, d."value") + FROM UNNEST($2::TEXT[]) f + LEFT OUTER JOIN jsonb_each(h."data") d + ON d."key" = f) d + FROM UNNEST($1::text[]) WITH ORDINALITY k("_key", i) + LEFT OUTER JOIN "legacy_object_live" o + ON o."_key" = k."_key" + LEFT OUTER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + ORDER BY k.i ASC`, + values: [keys, fields], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows.map(function (row) { + return row.d; + })); + }); + }; + + module.getObjectKeys = function (key, callback) { + if (!key) { + return callback(); + } + + db.query({ + name: 'getObjectKeys', + text: ` +SELECT ARRAY(SELECT jsonb_object_keys(h."data")) k + FROM "legacy_object_live" o + INNER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + WHERE o."_key" = $1::TEXT + LIMIT 1`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].k); + } + + callback(null, []); + }); + }; + + module.getObjectValues = function (key, callback) { + module.getObject(key, function (err, data) { + if (err) { + return callback(err); + } + + var values = []; + + if (data) { + for (var key in data) { + if (data.hasOwnProperty(key)) { + values.push(data[key]); + } + } + } + + callback(null, values); + }); + }; + + module.isObjectField = function (key, field, callback) { + if (!key) { + return callback(); + } + + db.query({ + name: 'isObjectField', + text: ` +SELECT (h."data" ? $2::TEXT AND h."data"->>$2::TEXT IS NOT NULL) b + FROM "legacy_object_live" o + INNER JOIN "legacy_hash" h + ON o."_key" = h."_key" + AND o."type" = h."type" + WHERE o."_key" = $1::TEXT + LIMIT 1`, + values: [key, field], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].b); + } + + callback(null, false); + }); + }; + + module.isObjectFields = function (key, fields, callback) { + if (!key) { + return callback(); + } + + module.getObjectFields(key, fields, function (err, data) { + if (err) { + return callback(err); + } + + if (!data) { + return callback(null, fields.map(function () { + return false; + })); + } + + callback(null, fields.map(function (field) { + return data.hasOwnProperty(field) && data[field] !== null; + })); + }); + }; + + module.deleteObjectField = function (key, field, callback) { + module.deleteObjectFields(key, [field], callback); + }; + + module.deleteObjectFields = function (key, fields, callback) { + callback = callback || helpers.noop; + if (!key || !Array.isArray(fields) || !fields.length) { + return callback(); + } + + db.query({ + name: 'deleteObjectFields', + text: ` +UPDATE "legacy_hash" + SET "data" = COALESCE((SELECT jsonb_object_agg("key", "value") + FROM jsonb_each("data") + WHERE "key" <> ALL ($2::TEXT[])), '{}') + WHERE "_key" = $1::TEXT`, + values: [key, fields], + }, function (err) { + callback(err); + }); + }; + + module.incrObjectField = function (key, field, callback) { + module.incrObjectFieldBy(key, field, 1, callback); + }; + + module.decrObjectField = function (key, field, callback) { + module.incrObjectFieldBy(key, field, -1, callback); + }; + + module.incrObjectFieldBy = function (key, field, value, callback) { + callback = callback || helpers.noop; + value = parseInt(value, 10); + + if (!key || isNaN(value)) { + return callback(null, null); + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.waterfall([ + async.apply(Array.isArray(key) ? helpers.ensureLegacyObjectsType : helpers.ensureLegacyObjectType, tx.client, key, 'hash'), + async.apply(query, Array.isArray(key) ? { + name: 'incrObjectFieldByMulti', + text: ` +INSERT INTO "legacy_hash" ("_key", "data") +SELECT UNNEST($1::TEXT[]), jsonb_build_object($2::TEXT, $3::NUMERIC) + ON CONFLICT ("_key") + DO UPDATE SET "data" = jsonb_set("legacy_hash"."data", ARRAY[$2::TEXT], to_jsonb(COALESCE(("legacy_hash"."data"->>$2::TEXT)::NUMERIC, 0) + $3::NUMERIC)) +RETURNING ("data"->>$2::TEXT)::NUMERIC v`, + values: [key, field, value], + } : { + name: 'incrObjectFieldBy', + text: ` +INSERT INTO "legacy_hash" ("_key", "data") +VALUES ($1::TEXT, jsonb_build_object($2::TEXT, $3::NUMERIC)) + ON CONFLICT ("_key") + DO UPDATE SET "data" = jsonb_set("legacy_hash"."data", ARRAY[$2::TEXT], to_jsonb(COALESCE(("legacy_hash"."data"->>$2::TEXT)::NUMERIC, 0) + $3::NUMERIC)) +RETURNING ("data"->>$2::TEXT)::NUMERIC v`, + values: [key, field, value], + }), + function (res, next) { + next(null, Array.isArray(key) ? res.rows.map(function (r) { + return parseFloat(r.v); + }) : parseFloat(res.rows[0].v)); + }, + ], done); + }, callback); + }; +}; diff --git a/src/database/postgres/helpers.js b/src/database/postgres/helpers.js new file mode 100644 index 0000000000..1b9a4d2cf6 --- /dev/null +++ b/src/database/postgres/helpers.js @@ -0,0 +1,139 @@ +'use strict'; + +var helpers = {}; + +helpers.valueToString = function (value) { + if (value === null || value === undefined) { + return value; + } + + return value.toString(); +}; + +helpers.removeDuplicateValues = function (values) { + var others = Array.prototype.slice.call(arguments, 1); + for (var i = 0; i < values.length; i++) { + if (values.lastIndexOf(values[i]) !== i) { + values.splice(i, 1); + for (var j = 0; j < others.length; j++) { + others[j].splice(i, 1); + } + i -= 1; + } + } +}; + +helpers.ensureLegacyObjectType = function (db, key, type, callback) { + db.query({ + name: 'ensureLegacyObjectTypeBefore', + text: ` +DELETE FROM "legacy_object" + WHERE "expireAt" IS NOT NULL + AND "expireAt" <= CURRENT_TIMESTAMP`, + }, function (err) { + if (err) { + return callback(err); + } + + db.query({ + name: 'ensureLegacyObjectType1', + text: ` +INSERT INTO "legacy_object" ("_key", "type") +VALUES ($1::TEXT, $2::TEXT::LEGACY_OBJECT_TYPE) + ON CONFLICT + DO NOTHING`, + values: [key, type], + }, function (err) { + if (err) { + return callback(err); + } + + db.query({ + name: 'ensureLegacyObjectType2', + text: ` +SELECT "type" + FROM "legacy_object_live" + WHERE "_key" = $1::TEXT`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows[0].type !== type) { + return callback(new Error('database: cannot insert ' + JSON.stringify(key) + ' as ' + type + ' because it already exists as ' + res.rows[0].type)); + } + + callback(null); + }); + }); + }); +}; + +helpers.ensureLegacyObjectsType = function (db, keys, type, callback) { + db.query({ + name: 'ensureLegacyObjectTypeBefore', + text: ` +DELETE FROM "legacy_object" + WHERE "expireAt" IS NOT NULL + AND "expireAt" <= CURRENT_TIMESTAMP`, + }, function (err) { + if (err) { + return callback(err); + } + + db.query({ + name: 'ensureLegacyObjectsType1', + text: ` +INSERT INTO "legacy_object" ("_key", "type") +SELECT k, $2::TEXT::LEGACY_OBJECT_TYPE + FROM UNNEST($1::TEXT[]) k + ON CONFLICT + DO NOTHING`, + values: [keys, type], + }, function (err) { + if (err) { + return callback(err); + } + + db.query({ + name: 'ensureLegacyObjectsType2', + text: ` +SELECT "_key", "type" + FROM "legacy_object_live" + WHERE "_key" = ANY($1::TEXT[])`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + var invalid = res.rows.filter(function (r) { + return r.type !== type; + }); + + if (invalid.length) { + return callback(new Error('database: cannot insert multiple objects as ' + type + ' because they already exist: ' + invalid.map(function (r) { + return JSON.stringify(r._key) + ' is ' + r.type; + }).join(', '))); + } + + var missing = keys.filter(function (k) { + return !res.rows.some(function (r) { + return r._key === k; + }); + }); + + if (missing.length) { + return callback(new Error('database: failed to insert keys for objects: ' + JSON.stringify(missing))); + } + + callback(null); + }); + }); + }); +}; + +helpers.noop = function () {}; + +module.exports = helpers; diff --git a/src/database/postgres/list.js b/src/database/postgres/list.js new file mode 100644 index 0000000000..9d11e16dff --- /dev/null +++ b/src/database/postgres/list.js @@ -0,0 +1,234 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + module.listPrepend = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'list'), + async.apply(query, { + name: 'listPrepend', + text: ` +INSERT INTO "legacy_list" ("_key", "array") +VALUES ($1::TEXT, ARRAY[$2::TEXT]) + ON CONFLICT ("_key") + DO UPDATE SET "array" = ARRAY[$2::TEXT] || "legacy_list"."array"`, + values: [key, value], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.listAppend = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'list'), + async.apply(query, { + name: 'listAppend', + text: ` +INSERT INTO "legacy_list" ("_key", "array") +VALUES ($1::TEXT, ARRAY[$2::TEXT]) + ON CONFLICT ("_key") + DO UPDATE SET "array" = "legacy_list"."array" || ARRAY[$2::TEXT]`, + values: [key, value], + }), + ], function (err) { + done(err); + }); + }, callback || helpers.noop); + }; + + module.listRemoveLast = function (key, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + db.query({ + name: 'listRemoveLast', + text: ` +WITH A AS ( + SELECT l.* + FROM "legacy_object_live" o + INNER JOIN "legacy_list" l + ON o."_key" = l."_key" + AND o."type" = l."type" + WHERE o."_key" = $1::TEXT + FOR UPDATE) +UPDATE "legacy_list" l + SET "array" = A."array"[1 : array_length(A."array", 1) - 1] + FROM A + WHERE A."_key" = l."_key" +RETURNING A."array"[array_length(A."array", 1)] v`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].v); + } + + callback(null, null); + }); + }; + + module.listRemoveAll = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + db.query({ + name: 'listRemoveAll', + text: ` +UPDATE "legacy_list" l + SET "array" = array_remove(l."array", $2::TEXT) + FROM "legacy_object_live" o + WHERE o."_key" = l."_key" + AND o."type" = l."type" + AND o."_key" = $1::TEXT`, + values: [key, value], + }, function (err) { + callback(err); + }); + }; + + module.listTrim = function (key, start, stop, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + stop += 1; + + db.query(stop > 0 ? { + name: 'listTrim', + text: ` +UPDATE "legacy_list" l + SET "array" = ARRAY(SELECT m.m + FROM UNNEST(l."array") WITH ORDINALITY m(m, i) + ORDER BY m.i ASC + LIMIT ($3::INTEGER - $2::INTEGER) + OFFSET $2::INTEGER) + FROM "legacy_object_live" o + WHERE o."_key" = l."_key" + AND o."type" = l."type" + AND o."_key" = $1::TEXT`, + values: [key, start, stop], + } : { + name: 'listTrimBack', + text: ` +UPDATE "legacy_list" l + SET "array" = ARRAY(SELECT m.m + FROM UNNEST(l."array") WITH ORDINALITY m(m, i) + ORDER BY m.i ASC + LIMIT ($3::INTEGER - $2::INTEGER + array_length(l."array", 1)) + OFFSET $2::INTEGER) + FROM "legacy_object_live" o + WHERE o."_key" = l."_key" + AND o."type" = l."type" + AND o."_key" = $1::TEXT`, + values: [key, start, stop], + }, function (err) { + callback(err); + }); + }; + + module.getListRange = function (key, start, stop, callback) { + if (!key) { + return callback(); + } + + stop += 1; + + db.query(stop > 0 ? { + name: 'getListRange', + text: ` +SELECT ARRAY(SELECT m.m + FROM UNNEST(l."array") WITH ORDINALITY m(m, i) + ORDER BY m.i ASC + LIMIT ($3::INTEGER - $2::INTEGER) + OFFSET $2::INTEGER) l + FROM "legacy_object_live" o + INNER JOIN "legacy_list" l + ON o."_key" = l."_key" + AND o."type" = l."type" + WHERE o."_key" = $1::TEXT`, + values: [key, start, stop], + } : { + name: 'getListRangeBack', + text: ` +SELECT ARRAY(SELECT m.m + FROM UNNEST(l."array") WITH ORDINALITY m(m, i) + ORDER BY m.i ASC + LIMIT ($3::INTEGER - $2::INTEGER + array_length(l."array", 1)) + OFFSET $2::INTEGER) l + FROM "legacy_object_live" o + INNER JOIN "legacy_list" l + ON o."_key" = l."_key" + AND o."type" = l."type" + WHERE o."_key" = $1::TEXT`, + values: [key, start, stop], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].l); + } + + callback(null, []); + }); + }; + + module.listLength = function (key, callback) { + db.query({ + name: 'listLength', + text: ` +SELECT array_length(l."array", 1) l + FROM "legacy_object_live" o + INNER JOIN "legacy_list" l + ON o."_key" = l."_key" + AND o."type" = l."type" + WHERE o."_key" = $1::TEXT`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].l); + } + + callback(null, 0); + }); + }; +}; diff --git a/src/database/postgres/main.js b/src/database/postgres/main.js new file mode 100644 index 0000000000..2dcc6ecd5e --- /dev/null +++ b/src/database/postgres/main.js @@ -0,0 +1,239 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + var query = db.query.bind(db); + + module.flushdb = function (callback) { + callback = callback || helpers.noop; + + async.series([ + async.apply(query, `DROP SCHEMA "public" CASCADE`), + async.apply(query, `CREATE SCHEMA "public"`), + ], function (err) { + callback(err); + }); + }; + + module.emptydb = function (callback) { + callback = callback || helpers.noop; + query(`DELETE FROM "legacy_object"`, function (err) { + callback(err); + }); + }; + + module.exists = function (key, callback) { + if (!key) { + return callback(); + } + + query({ + name: 'exists', + text: ` +SELECT EXISTS(SELECT * + FROM "legacy_object_live" + WHERE "_key" = $1::TEXT + LIMIT 1) e`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows[0].e); + }); + }; + + module.delete = function (key, callback) { + callback = callback || helpers.noop; + if (!key) { + return callback(); + } + + query({ + name: 'delete', + text: ` +DELETE FROM "legacy_object" + WHERE "_key" = $1::TEXT`, + values: [key], + }, function (err) { + callback(err); + }); + }; + + module.deleteAll = function (keys, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + query({ + name: 'deleteAll', + text: ` +DELETE FROM "legacy_object" + WHERE "_key" = ANY($1::TEXT[])`, + values: [keys], + }, function (err) { + callback(err); + }); + }; + + module.get = function (key, callback) { + if (!key) { + return callback(); + } + + query({ + name: 'get', + text: ` +SELECT s."data" t + FROM "legacy_object_live" o + INNER JOIN "legacy_string" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT + LIMIT 1`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].t); + } + + callback(null, null); + }); + }; + + module.set = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + module.transaction(function (tx, done) { + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'string'), + async.apply(tx.client.query.bind(tx.client), { + name: 'set', + text: ` +INSERT INTO "legacy_string" ("_key", "data") +VALUES ($1::TEXT, $2::TEXT) + ON CONFLICT ("_key") + DO UPDATE SET "data" = $2::TEXT`, + values: [key, value], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.increment = function (key, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + module.transaction(function (tx, done) { + async.waterfall([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'string'), + async.apply(tx.client.query.bind(tx.client), { + name: 'increment', + text: ` +INSERT INTO "legacy_string" ("_key", "data") +VALUES ($1::TEXT, '1') + ON CONFLICT ("_key") + DO UPDATE SET "data" = ("legacy_string"."data"::NUMERIC + 1)::TEXT +RETURNING "data" d`, + values: [key], + }), + ], function (err, res) { + if (err) { + return done(err); + } + + done(null, parseFloat(res.rows[0].d)); + }); + }, callback); + }; + + module.rename = function (oldKey, newKey, callback) { + module.transaction(function (tx, done) { + async.series([ + async.apply(tx.delete, newKey), + async.apply(tx.client.query.bind(tx.client), { + name: 'rename', + text: ` +UPDATE "legacy_object" + SET "_key" = $2::TEXT + WHERE "_key" = $1::TEXT`, + values: [oldKey, newKey], + }), + ], function (err) { + done(err); + }); + }, callback || helpers.noop); + }; + + module.type = function (key, callback) { + query({ + name: 'type', + text: ` +SELECT "type"::TEXT t + FROM "legacy_object_live" + WHERE "_key" = $1::TEXT + LIMIT 1`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].t); + } + + callback(null, null); + }); + }; + + function doExpire(key, date, callback) { + query({ + name: 'expire', + text: ` +UPDATE "legacy_object" + SET "expireAt" = $2::TIMESTAMPTZ + WHERE "_key" = $1::TEXT`, + values: [key, date], + }, function (err) { + if (callback) { + callback(err); + } + }); + } + + module.expire = function (key, seconds, callback) { + doExpire(key, new Date(((Date.now() / 1000) + seconds) * 1000), callback); + }; + + module.expireAt = function (key, timestamp, callback) { + doExpire(key, new Date(timestamp * 1000), callback); + }; + + module.pexpire = function (key, ms, callback) { + doExpire(key, new Date(Date.now() + parseInt(ms, 10)), callback); + }; + + module.pexpireAt = function (key, timestamp, callback) { + doExpire(key, new Date(timestamp), callback); + }; +}; diff --git a/src/database/postgres/pubsub.js b/src/database/postgres/pubsub.js new file mode 100644 index 0000000000..969ef62cb8 --- /dev/null +++ b/src/database/postgres/pubsub.js @@ -0,0 +1,51 @@ +'use strict'; + +var util = require('util'); +var winston = require('winston'); +var EventEmitter = require('events').EventEmitter; +var pg = require('pg'); +var db = require('../postgres'); + +var PubSub = function () { + var self = this; + + var subClient = new pg.Client(db.getConnectionOptions()); + + subClient.connect(function (err) { + if (err) { + winston.error(err); + return; + } + + subClient.query('LISTEN pubsub', function (err) { + if (err) { + winston.error(err); + } + }); + + subClient.on('notification', function (message) { + if (message.channel !== 'pubsub') { + return; + } + + try { + var msg = JSON.parse(message.payload); + self.emit(msg.event, msg.data); + } catch (err) { + winston.error(err.stack); + } + }); + }); +}; + +util.inherits(PubSub, EventEmitter); + +PubSub.prototype.publish = function (event, data) { + db.pool.query({ + name: 'pubSubPublish', + text: `SELECT pg_notify('pubsub', $1::TEXT)`, + values: [JSON.stringify({ event: event, data: data })], + }); +}; + +module.exports = new PubSub(); diff --git a/src/database/postgres/sets.js b/src/database/postgres/sets.js new file mode 100644 index 0000000000..615cb6ad42 --- /dev/null +++ b/src/database/postgres/sets.js @@ -0,0 +1,342 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + module.setAdd = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(value)) { + value = [value]; + } + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'set'), + async.apply(query, { + name: 'setAdd', + text: ` +INSERT INTO "legacy_set" ("_key", "member") +SELECT $1::TEXT, m + FROM UNNEST($2::TEXT[]) m + ON CONFLICT ("_key", "member") + DO NOTHING`, + values: [key, value], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.setsAdd = function (keys, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + if (!Array.isArray(value)) { + value = [value]; + } + + keys = keys.filter(function (k, i, a) { + return a.indexOf(k) === i; + }); + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectsType, tx.client, keys, 'set'), + async.apply(query, { + name: 'setsAdd', + text: ` +INSERT INTO "legacy_set" ("_key", "member") +SELECT k, m + FROM UNNEST($1::TEXT[]) k + CROSS JOIN UNNEST($2::TEXT[]) m + ON CONFLICT ("_key", "member") + DO NOTHING`, + values: [keys, value], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + module.setRemove = function (key, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(key)) { + key = [key]; + } + + if (!Array.isArray(value)) { + value = [value]; + } + + db.query({ + name: 'setRemove', + text: ` +DELETE FROM "legacy_set" + WHERE "_key" = ANY($1::TEXT[]) + AND "member" = ANY($2::TEXT[])`, + values: [key, value], + }, function (err) { + callback(err); + }); + }; + + module.setsRemove = function (keys, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + db.query({ + name: 'setsRemove', + text: ` +DELETE FROM "legacy_set" + WHERE "_key" = ANY($1::TEXT[]) + AND "member" = $2::TEXT`, + values: [keys, value], + }, function (err) { + callback(err); + }); + }; + + module.isSetMember = function (key, value, callback) { + if (!key) { + return callback(null, false); + } + + db.query({ + name: 'isSetMember', + text: ` +SELECT 1 + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT + AND s."member" = $2::TEXT`, + values: [key, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, !!res.rows.length); + }); + }; + + module.isSetMembers = function (key, values, callback) { + if (!key || !Array.isArray(values) || !values.length) { + return callback(null, []); + } + + values = values.map(helpers.valueToString); + + db.query({ + name: 'isSetMembers', + text: ` +SELECT s."member" m + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT + AND s."member" = ANY($2::TEXT[])`, + values: [key, values], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, values.map(function (v) { + return res.rows.some(function (r) { + return r.m === v; + }); + })); + }); + }; + + module.isMemberOfSets = function (sets, value, callback) { + if (!Array.isArray(sets) || !sets.length) { + return callback(null, []); + } + + value = helpers.valueToString(value); + + db.query({ + name: 'isMemberOfSets', + text: ` +SELECT o."_key" k + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = ANY($1::TEXT[]) + AND s."member" = $2::TEXT`, + values: [sets, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, sets.map(function (s) { + return res.rows.some(function (r) { + return r.k === s; + }); + })); + }); + }; + + module.getSetMembers = function (key, callback) { + if (!key) { + return callback(null, []); + } + + db.query({ + name: 'getSetMembers', + text: ` +SELECT s."member" m + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows.map(function (r) { + return r.m; + })); + }); + }; + + module.getSetsMembers = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + + db.query({ + name: 'getSetsMembers', + text: ` +SELECT o."_key" k, + array_agg(s."member") m + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = ANY($1::TEXT[]) + GROUP BY o."_key"`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + return (res.rows.find(function (r) { + return r.k === k; + }) || { m: [] }).m; + })); + }); + }; + + module.setCount = function (key, callback) { + if (!key) { + return callback(null, 0); + } + + db.query({ + name: 'setCount', + text: ` +SELECT COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + module.setsCount = function (keys, callback) { + db.query({ + name: 'setsCount', + text: ` +SELECT o."_key" k, + COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = ANY($1::TEXT[]) + GROUP BY o."_key"`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + return (res.rows.find(function (r) { + return r.k === k; + }) || { c: 0 }).c; + })); + }); + }; + + module.setRemoveRandom = function (key, callback) { + callback = callback || helpers.noop; + + db.query({ + name: 'setRemoveRandom', + text: ` +WITH A AS ( + SELECT s."member" + FROM "legacy_object_live" o + INNER JOIN "legacy_set" s + ON o."_key" = s."_key" + AND o."type" = s."type" + WHERE o."_key" = $1::TEXT + ORDER BY RANDOM() + LIMIT 1 + FOR UPDATE) +DELETE FROM "legacy_set" s + USING A + WHERE s."_key" = $1::TEXT + AND s."member" = A."member" +RETURNING A."member" m`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, res.rows[0].m); + } + + callback(null, null); + }); + }; +}; diff --git a/src/database/postgres/sorted.js b/src/database/postgres/sorted.js new file mode 100644 index 0000000000..7f136ac653 --- /dev/null +++ b/src/database/postgres/sorted.js @@ -0,0 +1,744 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + var query = db.query.bind(db); + + require('./sorted/add')(db, module); + require('./sorted/remove')(db, module); + require('./sorted/union')(db, module); + require('./sorted/intersect')(db, module); + + module.getSortedSetRange = function (key, start, stop, callback) { + getSortedSetRange(key, start, stop, 1, false, callback); + }; + + module.getSortedSetRevRange = function (key, start, stop, callback) { + getSortedSetRange(key, start, stop, -1, false, callback); + }; + + module.getSortedSetRangeWithScores = function (key, start, stop, callback) { + getSortedSetRange(key, start, stop, 1, true, callback); + }; + + module.getSortedSetRevRangeWithScores = function (key, start, stop, callback) { + getSortedSetRange(key, start, stop, -1, true, callback); + }; + + function getSortedSetRange(key, start, stop, sort, withScores, callback) { + if (!key) { + return callback(); + } + + if (!Array.isArray(key)) { + key = [key]; + } + + if (start < 0 && start > stop) { + return callback(null, []); + } + + var reverse = false; + if (start === 0 && stop < -1) { + reverse = true; + sort *= -1; + start = Math.abs(stop + 1); + stop = -1; + } else if (start < 0 && stop > start) { + var tmp1 = Math.abs(stop + 1); + stop = Math.abs(start + 1); + start = tmp1; + } + + var limit = stop - start + 1; + if (limit <= 0) { + limit = null; + } + + query({ + name: 'getSortedSetRangeWithScores' + (sort > 0 ? 'Asc' : 'Desc'), + text: ` +SELECT z."value", + z."score" + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + ORDER BY z."score" ` + (sort > 0 ? 'ASC' : 'DESC') + ` + LIMIT $3::INTEGER +OFFSET $2::INTEGER`, + values: [key, start, limit], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (reverse) { + res.rows.reverse(); + } + + if (withScores) { + res.rows = res.rows.map(function (r) { + return { + value: r.value, + score: parseFloat(r.score), + }; + }); + } else { + res.rows = res.rows.map(function (r) { + return r.value; + }); + } + + callback(null, res.rows); + }); + } + + module.getSortedSetRangeByScore = function (key, start, count, min, max, callback) { + getSortedSetRangeByScore(key, start, count, min, max, 1, false, callback); + }; + + module.getSortedSetRevRangeByScore = function (key, start, count, max, min, callback) { + getSortedSetRangeByScore(key, start, count, min, max, -1, false, callback); + }; + + module.getSortedSetRangeByScoreWithScores = function (key, start, count, min, max, callback) { + getSortedSetRangeByScore(key, start, count, min, max, 1, true, callback); + }; + + module.getSortedSetRevRangeByScoreWithScores = function (key, start, count, max, min, callback) { + getSortedSetRangeByScore(key, start, count, min, max, -1, true, callback); + }; + + function getSortedSetRangeByScore(key, start, count, min, max, sort, withScores, callback) { + if (!key) { + return callback(); + } + + if (!Array.isArray(key)) { + key = [key]; + } + + if (parseInt(count, 10) === -1) { + count = null; + } + + if (min === '-inf') { + min = null; + } + if (max === '+inf') { + max = null; + } + + query({ + name: 'getSortedSetRangeByScoreWithScores' + (sort > 0 ? 'Asc' : 'Desc'), + text: ` +SELECT z."value", + z."score" + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + AND (z."score" >= $4::NUMERIC OR $4::NUMERIC IS NULL) + AND (z."score" <= $5::NUMERIC OR $5::NUMERIC IS NULL) + ORDER BY z."score" ` + (sort > 0 ? 'ASC' : 'DESC') + ` + LIMIT $3::INTEGER +OFFSET $2::INTEGER`, + values: [key, start, count, min, max], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (withScores) { + res.rows = res.rows.map(function (r) { + return { + value: r.value, + score: parseFloat(r.score), + }; + }); + } else { + res.rows = res.rows.map(function (r) { + return r.value; + }); + } + + return callback(null, res.rows); + }); + } + + module.sortedSetCount = function (key, min, max, callback) { + if (!key) { + return callback(); + } + + if (min === '-inf') { + min = null; + } + if (max === '+inf') { + max = null; + } + + query({ + name: 'sortedSetCount', + text: ` +SELECT COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + AND (z."score" >= $2::NUMERIC OR $2::NUMERIC IS NULL) + AND (z."score" <= $3::NUMERIC OR $3::NUMERIC IS NULL)`, + values: [key, min, max], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + module.sortedSetCard = function (key, callback) { + if (!key) { + return callback(null, 0); + } + + query({ + name: 'sortedSetCard', + text: ` +SELECT COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + module.sortedSetsCard = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + query({ + name: 'sortedSetsCard', + text: ` +SELECT o."_key" k, + COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + GROUP BY o."_key"`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + return parseInt((res.rows.find(function (r) { + return r.k === k; + }) || { c: 0 }).c, 10); + })); + }); + }; + + module.sortedSetRank = function (key, value, callback) { + getSortedSetRank('ASC', [key], [value], function (err, result) { + callback(err, result ? result[0] : null); + }); + }; + + module.sortedSetRevRank = function (key, value, callback) { + getSortedSetRank('DESC', [key], [value], function (err, result) { + callback(err, result ? result[0] : null); + }); + }; + + function getSortedSetRank(sort, keys, values, callback) { + values = values.map(helpers.valueToString); + query({ + name: 'getSortedSetRank' + sort, + text: ` +SELECT (SELECT r + FROM (SELECT z."value" v, + RANK() OVER (PARTITION BY o."_key" + ORDER BY z."score" ` + sort + `, + z."value" ` + sort + `) - 1 r + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = kvi.k) r + WHERE v = kvi.v) r + FROM UNNEST($1::TEXT[], $2::TEXT[]) WITH ORDINALITY kvi(k, v, i) + ORDER BY kvi.i ASC`, + values: [keys, values], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows.map(function (r) { return r.r === null ? null : parseFloat(r.r); })); + }); + } + + module.sortedSetsRanks = function (keys, values, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + + getSortedSetRank('ASC', keys, values, callback); + }; + + module.sortedSetRanks = function (key, values, callback) { + if (!Array.isArray(values) || !values.length) { + return callback(null, []); + } + + getSortedSetRank('ASC', new Array(values.length).fill(key), values, callback); + }; + + module.sortedSetScore = function (key, value, callback) { + if (!key) { + return callback(null, null); + } + + value = helpers.valueToString(value); + + query({ + name: 'sortedSetScore', + text: ` +SELECT z."score" s + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + AND z."value" = $2::TEXT`, + values: [key, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (res.rows.length) { + return callback(null, parseFloat(res.rows[0].s)); + } + + callback(null, null); + }); + }; + + module.sortedSetsScore = function (keys, value, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + value = helpers.valueToString(value); + + query({ + name: 'sortedSetsScore', + text: ` +SELECT o."_key" k, + z."score" s + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + AND z."value" = $2::TEXT`, + values: [keys, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + var s = res.rows.find(function (r) { + return r.k === k; + }); + + return s ? parseFloat(s.s) : null; + })); + }); + }; + + module.sortedSetScores = function (key, values, callback) { + if (!key) { + return callback(null, null); + } + + values = values.map(helpers.valueToString); + + query({ + name: 'sortedSetScores', + text: ` +SELECT z."value" v, + z."score" s + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + AND z."value" = ANY($2::TEXT[])`, + values: [key, values], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, values.map(function (v) { + var s = res.rows.find(function (r) { + return r.v === v; + }); + + return s ? parseFloat(s.s) : null; + })); + }); + }; + + module.isSortedSetMember = function (key, value, callback) { + if (!key) { + return callback(); + } + + value = helpers.valueToString(value); + + query({ + name: 'isSortedSetMember', + text: ` +SELECT 1 + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + AND z."value" = $2::TEXT`, + values: [key, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, !!res.rows.length); + }); + }; + + module.isSortedSetMembers = function (key, values, callback) { + if (!key) { + return callback(); + } + + values = values.map(helpers.valueToString); + + query({ + name: 'isSortedSetMembers', + text: ` +SELECT z."value" v + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + AND z."value" = ANY($2::TEXT[])`, + values: [key, values], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, values.map(function (v) { + return res.rows.some(function (r) { + return r.v === v; + }); + })); + }); + }; + + module.isMemberOfSortedSets = function (keys, value, callback) { + if (!Array.isArray(keys)) { + return callback(); + } + + value = helpers.valueToString(value); + + query({ + name: 'isMemberOfSortedSets', + text: ` +SELECT o."_key" k + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + AND z."value" = $2::TEXT`, + values: [keys, value], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + return res.rows.some(function (r) { + return r.k === k; + }); + })); + }); + }; + + module.getSortedSetsMembers = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + + query({ + name: 'getSortedSetsMembers', + text: ` +SELECT o."_key" k, + array_agg(z."value" ORDER BY z."score" ASC) m + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + GROUP BY o."_key"`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, keys.map(function (k) { + return (res.rows.find(function (r) { + return r.k === k; + }) || { m: [] }).m; + })); + }); + }; + + module.sortedSetIncrBy = function (key, increment, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + value = helpers.valueToString(value); + increment = parseFloat(increment); + + module.transaction(function (tx, done) { + async.waterfall([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'zset'), + async.apply(tx.client.query.bind(tx.client), { + name: 'sortedSetIncrBy', + text: ` +INSERT INTO "legacy_zset" ("_key", "value", "score") +VALUES ($1::TEXT, $2::TEXT, $3::NUMERIC) + ON CONFLICT ("_key", "value") + DO UPDATE SET "score" = "legacy_zset"."score" + $3::NUMERIC +RETURNING "score" s`, + values: [key, value, increment], + }), + function (res, next) { + next(null, parseFloat(res.rows[0].s)); + }, + ], done); + }, callback); + }; + + module.getSortedSetRangeByLex = function (key, min, max, start, count, callback) { + sortedSetLex(key, min, max, 1, start, count, callback); + }; + + module.getSortedSetRevRangeByLex = function (key, max, min, start, count, callback) { + sortedSetLex(key, min, max, -1, start, count, callback); + }; + + module.sortedSetLexCount = function (key, min, max, callback) { + var q = buildLexQuery(key, min, max); + + query({ + name: 'sortedSetLexCount' + q.suffix, + text: ` +SELECT COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE ` + q.where, + values: q.values, + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + function sortedSetLex(key, min, max, sort, start, count, callback) { + if (!callback) { + callback = start; + start = 0; + count = 0; + } + + var q = buildLexQuery(key, min, max); + q.values.push(start); + q.values.push(count <= 0 ? null : count); + query({ + name: 'sortedSetLex' + (sort > 0 ? 'Asc' : 'Desc') + q.suffix, + text: ` +SELECT z."value" v + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE ` + q.where + ` + ORDER BY z."value" ` + (sort > 0 ? 'ASC' : 'DESC') + ` + LIMIT $` + q.values.length + `::INTEGER +OFFSET $` + (q.values.length - 1) + `::INTEGER`, + values: q.values, + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows.map(function (r) { + return r.v; + })); + }); + } + + module.sortedSetRemoveRangeByLex = function (key, min, max, callback) { + callback = callback || helpers.noop; + + var q = buildLexQuery(key, min, max); + query({ + name: 'sortedSetRemoveRangeByLex' + q.suffix, + text: ` +DELETE FROM "legacy_zset" z + USING "legacy_object_live" o + WHERE o."_key" = z."_key" + AND o."type" = z."type" + AND ` + q.where, + values: q.values, + }, function (err) { + callback(err); + }); + }; + + function buildLexQuery(key, min, max) { + var q = { + suffix: '', + where: `o."_key" = $1::TEXT`, + values: [key], + }; + + if (min !== '-') { + if (min.match(/^\(/)) { + q.values.push(min.substr(1)); + q.suffix += 'GT'; + q.where += ` AND z."value" > $` + q.values.length + `::TEXT`; + } else if (min.match(/^\[/)) { + q.values.push(min.substr(1)); + q.suffix += 'GE'; + q.where += ` AND z."value" >= $` + q.values.length + `::TEXT`; + } else { + q.values.push(min); + q.suffix += 'GE'; + q.where += ` AND z."value" >= $` + q.values.length + `::TEXT`; + } + } + + if (max !== '+') { + if (max.match(/^\(/)) { + q.values.push(max.substr(1)); + q.suffix += 'LT'; + q.where += ` AND z."value" < $` + q.values.length + `::TEXT`; + } else if (max.match(/^\[/)) { + q.values.push(max.substr(1)); + q.suffix += 'LE'; + q.where += ` AND z."value" <= $` + q.values.length + `::TEXT`; + } else { + q.values.push(max); + q.suffix += 'LE'; + q.where += ` AND z."value" <= $` + q.values.length + `::TEXT`; + } + } + + return q; + } + + module.processSortedSet = function (setKey, process, options, callback) { + var Cursor = require('pg-cursor'); + + db.connect(function (err, client, done) { + if (err) { + return callback(err); + } + + var batchSize = (options || {}).batch || 100; + var query = client.query(new Cursor(` +SELECT z."value" v + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = $1::TEXT + ORDER BY z."score" ASC, z."value" ASC`, [setKey])); + + async.doUntil(function (next) { + query.read(batchSize, function (err, rows) { + if (err) { + return next(err); + } + + if (!rows.length) { + return next(null, true); + } + + rows = rows.map(function (row) { + return row.v; + }); + + process(rows, function (err) { + if (err) { + return query.close(function () { + next(err); + }); + } + + if (options.interval) { + setTimeout(next, options.interval); + } else { + next(); + } + }); + }); + }, function (stop) { + return stop; + }, function (err) { + done(); + callback(err); + }); + }); + }; +}; diff --git a/src/database/postgres/sorted/add.js b/src/database/postgres/sorted/add.js new file mode 100644 index 0000000000..a187091746 --- /dev/null +++ b/src/database/postgres/sorted/add.js @@ -0,0 +1,108 @@ +'use strict'; + +var async = require('async'); + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + module.sortedSetAdd = function (key, score, value, callback) { + callback = callback || helpers.noop; + + if (!key) { + return callback(); + } + + if (Array.isArray(score) && Array.isArray(value)) { + return sortedSetAddBulk(key, score, value, callback); + } + + value = helpers.valueToString(value); + score = parseFloat(score); + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'zset'), + async.apply(query, { + name: 'sortedSetAdd', + text: ` +INSERT INTO "legacy_zset" ("_key", "value", "score") +VALUES ($1::TEXT, $2::TEXT, $3::NUMERIC) + ON CONFLICT ("_key", "value") + DO UPDATE SET "score" = $3::NUMERIC`, + values: [key, value, score], + }), + ], function (err) { + done(err); + }); + }, callback); + }; + + function sortedSetAddBulk(key, scores, values, callback) { + if (!scores.length || !values.length) { + return callback(); + } + if (scores.length !== values.length) { + return callback(new Error('[[error:invalid-data]]')); + } + + values = values.map(helpers.valueToString); + scores = scores.map(function (score) { + return parseFloat(score); + }); + + helpers.removeDuplicateValues(values, scores); + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectType, tx.client, key, 'zset'), + async.apply(query, { + name: 'sortedSetAddBulk', + text: ` +INSERT INTO "legacy_zset" ("_key", "value", "score") +SELECT $1::TEXT, v, s + FROM UNNEST($2::TEXT[], $3::NUMERIC[]) vs(v, s) + ON CONFLICT ("_key", "value") + DO UPDATE SET "score" = EXCLUDED."score"`, + values: [key, values, scores], + }), + ], function (err) { + done(err); + }); + }, callback); + } + + module.sortedSetsAdd = function (keys, score, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + value = helpers.valueToString(value); + score = parseFloat(score); + + module.transaction(function (tx, done) { + var query = tx.client.query.bind(tx.client); + + async.series([ + async.apply(helpers.ensureLegacyObjectsType, tx.client, keys, 'zset'), + async.apply(query, { + name: 'sortedSetsAdd', + text: ` +INSERT INTO "legacy_zset" ("_key", "value", "score") +SELECT k, $2::TEXT, $3::NUMERIC + FROM UNNEST($1::TEXT[]) k + ON CONFLICT ("_key", "value") + DO UPDATE SET "score" = $3::NUMERIC`, + values: [keys, value, score], + }), + ], function (err) { + done(err); + }); + }, callback); + }; +}; diff --git a/src/database/postgres/sorted/intersect.js b/src/database/postgres/sorted/intersect.js new file mode 100644 index 0000000000..47fe5b9b16 --- /dev/null +++ b/src/database/postgres/sorted/intersect.js @@ -0,0 +1,105 @@ +'use strict'; + +module.exports = function (db, module) { + module.sortedSetIntersectCard = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, 0); + } + + db.query({ + name: 'sortedSetIntersectCard', + text: ` +WITH A AS (SELECT z."value" v, + COUNT(*) c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[]) + GROUP BY z."value") +SELECT COUNT(*) c + FROM A + WHERE A.c = array_length($1::TEXT[], 1)`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + + module.getSortedSetIntersect = function (params, callback) { + params.sort = 1; + getSortedSetIntersect(params, callback); + }; + + module.getSortedSetRevIntersect = function (params, callback) { + params.sort = -1; + getSortedSetIntersect(params, callback); + }; + + function getSortedSetIntersect(params, callback) { + var sets = params.sets; + var start = params.hasOwnProperty('start') ? params.start : 0; + var stop = params.hasOwnProperty('stop') ? params.stop : -1; + var weights = params.weights || []; + var aggregate = params.aggregate || 'SUM'; + + if (sets.length < weights.length) { + weights = weights.slice(0, sets.length); + } + while (sets.length > weights.length) { + weights.push(1); + } + + var limit = stop - start + 1; + if (limit <= 0) { + limit = null; + } + + db.query({ + name: 'getSortedSetIntersect' + aggregate + (params.sort > 0 ? 'Asc' : 'Desc') + 'WithScores', + text: ` +WITH A AS (SELECT z."value", + ` + aggregate + `(z."score" * k."weight") "score", + COUNT(*) c + FROM UNNEST($1::TEXT[], $2::NUMERIC[]) k("_key", "weight") + INNER JOIN "legacy_object_live" o + ON o."_key" = k."_key" + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + GROUP BY z."value") +SELECT A."value", + A."score" + FROM A + WHERE c = array_length($1::TEXT[], 1) + ORDER BY A."score" ` + (params.sort > 0 ? 'ASC' : 'DESC') + ` + LIMIT $4::INTEGER +OFFSET $3::INTEGER`, + values: [sets, weights, start, limit], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (params.withScores) { + res.rows = res.rows.map(function (r) { + return { + value: r.value, + score: parseFloat(r.score), + }; + }); + } else { + res.rows = res.rows.map(function (r) { + return r.value; + }); + } + + callback(null, res.rows); + }); + } +}; diff --git a/src/database/postgres/sorted/remove.js b/src/database/postgres/sorted/remove.js new file mode 100644 index 0000000000..6118b22981 --- /dev/null +++ b/src/database/postgres/sorted/remove.js @@ -0,0 +1,83 @@ +'use strict'; + +module.exports = function (db, module) { + var helpers = module.helpers.postgres; + + module.sortedSetRemove = function (key, value, callback) { + function done(err) { + if (callback) { + callback(err); + } + } + + if (!key) { + return done(); + } + + if (!Array.isArray(key)) { + key = [key]; + } + + if (!Array.isArray(value)) { + value = [value]; + } + value = value.map(helpers.valueToString); + + db.query({ + name: 'sortedSetRemove', + text: ` +DELETE FROM "legacy_zset" + WHERE "_key" = ANY($1::TEXT[]) + AND "value" = ANY($2::TEXT[])`, + values: [key, value], + }, done); + }; + + module.sortedSetsRemove = function (keys, value, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + value = helpers.valueToString(value); + + db.query({ + name: 'sortedSetsRemove', + text: ` +DELETE FROM "legacy_zset" + WHERE "_key" = ANY($1::TEXT[]) + AND "value" = $2::TEXT`, + values: [keys, value], + }, function (err) { + callback(err); + }); + }; + + module.sortedSetsRemoveRangeByScore = function (keys, min, max, callback) { + callback = callback || helpers.noop; + + if (!Array.isArray(keys) || !keys.length) { + return callback(); + } + + if (min === '-inf') { + min = null; + } + if (max === '+inf') { + max = null; + } + + db.query({ + name: 'sortedSetsRemoveRangeByScore', + text: ` +DELETE FROM "legacy_zset" + WHERE "_key" = ANY($1::TEXT[]) + AND ("score" >= $2::NUMERIC OR $2::NUMERIC IS NULL) + AND ("score" <= $3::NUMERIC OR $3::NUMERIC IS NULL)`, + values: [keys, min, max], + }, function (err) { + callback(err); + }); + }; +}; diff --git a/src/database/postgres/sorted/union.js b/src/database/postgres/sorted/union.js new file mode 100644 index 0000000000..2f991dc761 --- /dev/null +++ b/src/database/postgres/sorted/union.js @@ -0,0 +1,97 @@ +'use strict'; + +module.exports = function (db, module) { + module.sortedSetUnionCard = function (keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, 0); + } + + db.query({ + name: 'sortedSetUnionCard', + text: ` +SELECT COUNT(DISTINCT z."value") c + FROM "legacy_object_live" o + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + WHERE o."_key" = ANY($1::TEXT[])`, + values: [keys], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, parseInt(res.rows[0].c, 10)); + }); + }; + + module.getSortedSetUnion = function (params, callback) { + params.sort = 1; + getSortedSetUnion(params, callback); + }; + + module.getSortedSetRevUnion = function (params, callback) { + params.sort = -1; + getSortedSetUnion(params, callback); + }; + + function getSortedSetUnion(params, callback) { + var sets = params.sets; + var start = params.hasOwnProperty('start') ? params.start : 0; + var stop = params.hasOwnProperty('stop') ? params.stop : -1; + var weights = params.weights || []; + var aggregate = params.aggregate || 'SUM'; + + if (sets.length < weights.length) { + weights = weights.slice(0, sets.length); + } + while (sets.length > weights.length) { + weights.push(1); + } + + var limit = stop - start + 1; + if (limit <= 0) { + limit = null; + } + + db.query({ + name: 'getSortedSetUnion' + aggregate + (params.sort > 0 ? 'Asc' : 'Desc') + 'WithScores', + text: ` +WITH A AS (SELECT z."value", + ` + aggregate + `(z."score" * k."weight") "score" + FROM UNNEST($1::TEXT[], $2::NUMERIC[]) k("_key", "weight") + INNER JOIN "legacy_object_live" o + ON o."_key" = k."_key" + INNER JOIN "legacy_zset" z + ON o."_key" = z."_key" + AND o."type" = z."type" + GROUP BY z."value") +SELECT A."value", + A."score" + FROM A + ORDER BY A."score" ` + (params.sort > 0 ? 'ASC' : 'DESC') + ` + LIMIT $4::INTEGER +OFFSET $3::INTEGER`, + values: [sets, weights, start, limit], + }, function (err, res) { + if (err) { + return callback(err); + } + + if (params.withScores) { + res.rows = res.rows.map(function (r) { + return { + value: r.value, + score: parseFloat(r.score), + }; + }); + } else { + res.rows = res.rows.map(function (r) { + return r.value; + }); + } + + callback(null, res.rows); + }); + } +}; diff --git a/src/database/postgres/transaction.js b/src/database/postgres/transaction.js new file mode 100644 index 0000000000..ed13d7a537 --- /dev/null +++ b/src/database/postgres/transaction.js @@ -0,0 +1,50 @@ +'use strict'; + +module.exports = function (db, dbNamespace, module) { + module.transaction = function (perform, callback) { + if (dbNamespace.active && dbNamespace.get('db')) { + var client = dbNamespace.get('db'); + return client.query(`SAVEPOINT nodebb_subtx`, function (err) { + if (err) { + return callback(err); + } + + perform(module, function (err) { + var args = Array.prototype.slice.call(arguments, 1); + + client.query(err ? `ROLLBACK TO SAVEPOINT nodebb_subtx` : `RELEASE SAVEPOINT nodebb_subtx`, function (err1) { + callback.apply(this, [err || err1].concat(args)); + }); + }); + }); + } + + db.connect(function (err, client, done) { + if (err) { + return callback(err); + } + + dbNamespace.run(function () { + dbNamespace.set('db', client); + + client.query(`BEGIN`, function (err) { + if (err) { + done(); + dbNamespace.set('db', null); + return callback(err); + } + + perform(module, function (err) { + var args = Array.prototype.slice.call(arguments, 1); + + client.query(err ? `ROLLBACK` : `COMMIT`, function (err1) { + done(); + dbNamespace.set('db', null); + callback.apply(this, [err || err1].concat(args)); + }); + }); + }); + }); + }); + }; +}; diff --git a/src/database/redis.js b/src/database/redis.js index 4bbd6ed0da..8186a950e2 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -50,6 +50,7 @@ redisModule.init = function (callback) { require('./redis/sets')(redisClient, redisModule); require('./redis/sorted')(redisClient, redisModule); require('./redis/list')(redisClient, redisModule); + require('./redis/transaction')(redisClient, redisModule); callback(); }); diff --git a/src/database/redis/transaction.js b/src/database/redis/transaction.js new file mode 100644 index 0000000000..75ea5fbaa2 --- /dev/null +++ b/src/database/redis/transaction.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = function (db, module) { + // TODO + module.transaction = function (perform, callback) { + perform(db, callback); + }; +}; diff --git a/src/install.js b/src/install.js index 25cb213488..cd628b13d9 100644 --- a/src/install.js +++ b/src/install.js @@ -126,7 +126,8 @@ function setupConfig(next) { var config = {}; var redisQuestions = require('./database/redis').questions; var mongoQuestions = require('./database/mongo').questions; - var allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions); + var postgresQuestions = require('./database/postgres').questions; + var allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions).concat(postgresQuestions); allQuestions.forEach(function (question) { config[question.name] = install.values[question.name] || question.default || undefined; diff --git a/src/pubsub.js b/src/pubsub.js index 82c4a1b57b..e67fc87fc9 100644 --- a/src/pubsub.js +++ b/src/pubsub.js @@ -33,6 +33,8 @@ function get() { pubsub = require('./database/redis/pubsub'); } else if (nconf.get('mongo')) { pubsub = require('./database/mongo/pubsub'); + } else if (nconf.get('postgres')) { + pubsub = require('./database/postgres/pubsub'); } real = pubsub; diff --git a/src/upgrades/1.4.6/delete_sessions.js b/src/upgrades/1.4.6/delete_sessions.js index c899126bde..28db5948b5 100644 --- a/src/upgrades/1.4.6/delete_sessions.js +++ b/src/upgrades/1.4.6/delete_sessions.js @@ -45,10 +45,12 @@ module.exports = { ], function (err) { next(err); }); - } else { + } else if (db.client && db.client.collection) { db.client.collection('sessions').deleteMany({}, {}, function (err) { next(err); }); + } else { + next(); } }, ], callback); diff --git a/src/views/admin/advanced/database.tpl b/src/views/admin/advanced/database.tpl index 9519ce9141..53533a9249 100644 --- a/src/views/admin/advanced/database.tpl +++ b/src/views/admin/advanced/database.tpl @@ -57,6 +57,19 @@
+ +
+
[[admin/advanced/database:postgres]]
+
+
+ [[admin/advanced/database:postgres.version]] {postgres.version}
+
+ [[admin/advanced/database:uptime-seconds]] {postgres.uptime}
+
+
+
+ +
@@ -84,5 +97,19 @@
+ + +
+
+

[[admin/advanced/database:postgres.raw-info]]

+
+ +
+
+
{postgres.raw}
+
+
+
+
diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index f24231b952..4f2f87cf46 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -102,6 +102,7 @@
There was an error connecting to your database. Please try again.
diff --git a/test/controllers-admin.js b/test/controllers-admin.js index 24da882cbe..f35dd437fa 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -185,6 +185,8 @@ describe('Admin Controllers', function () { assert(body.redis); } else if (nconf.get('mongo')) { assert(body.mongo); + } else if (nconf.get('postgres')) { + assert(body.postgres); } done(); }); diff --git a/test/database.js b/test/database.js index 327d8095cf..b88e425fd6 100644 --- a/test/database.js +++ b/test/database.js @@ -48,6 +48,11 @@ describe('Test database', function () { assert.equal(err.message, 'The `mongodb` package is out-of-date, please run `./nodebb setup` again.'); done(); }); + } else if (dbName === 'postgres') { + db.checkCompatibilityVersion('6.3.0', function (err) { + assert.equal(err.message, 'The `pg` package is out-of-date, please run `./nodebb setup` again.'); + done(); + }); } }); }); diff --git a/test/database/list.js b/test/database/list.js index 23768eb85d..76e7029f5c 100644 --- a/test/database/list.js +++ b/test/database/list.js @@ -111,16 +111,16 @@ describe('List methods', function () { before(function (done) { async.series([ function (next) { - db.listAppend('testList4', 12, next); + db.listAppend('testList7', 12, next); }, function (next) { - db.listPrepend('testList4', 9, next); + db.listPrepend('testList7', 9, next); }, ], done); }); it('should remove the last element of list and return it', function (done) { - db.listRemoveLast('testList4', function (err, lastElement) { + db.listRemoveLast('testList7', function (err, lastElement) { assert.equal(err, null); assert.equal(arguments.length, 2); assert.equal(lastElement, '12'); diff --git a/test/database/sorted.js b/test/database/sorted.js index 2b7babf951..6d31d80935 100644 --- a/test/database/sorted.js +++ b/test/database/sorted.js @@ -42,6 +42,21 @@ describe('Sorted Set methods', function () { done(); }); }); + + it('should gracefully handle adding the same element twice', function (done) { + db.sortedSetAdd('sorted2', [1, 2], ['value1', 'value1'], function (err) { + assert.equal(err, null); + assert.equal(arguments.length, 1); + + db.sortedSetScore('sorted2', 'value1', function (err, score) { + assert.equal(err, null); + assert.equal(score, 2); + assert.equal(arguments.length, 2); + + done(); + }); + }); + }); }); describe('sortedSetsAdd()', function () { diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 0aaab1647e..7fee6efede 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -59,6 +59,14 @@ if (!testDbConfig) { ' "password": "",\n' + ' "database": "nodebb_test"\n' + '}\n' + + ' or (postgres):\n' + + '"test_database": {\n' + + ' "host": "127.0.0.1",\n' + + ' "port": "5432",\n' + + ' "username": "postgres",\n' + + ' "password": "",\n' + + ' "database": "nodebb_test"\n' + + '}\n' + '===========================================================' ); winston.error(errorText); From f2965bd903d467a1565429b37d3505eecedf281c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 8 Aug 2018 19:14:31 +0000 Subject: [PATCH 087/310] Update dependency connect-pg-simple to v5 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f9b0ec9e95..3dc425aa01 100644 --- a/install/package.json +++ b/install/package.json @@ -35,7 +35,7 @@ "connect-flash": "^0.1.1", "connect-mongo": "2.0.1", "connect-multiparty": "^2.1.0", - "connect-pg-simple": "^4.2.1", + "connect-pg-simple": "^5.0.0", "connect-redis": "3.3.3", "continuation-local-storage": "^3.2.1", "cookie-parser": "^1.4.3", From 14d810c113f4f470f43869a920d77911885528f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 9 Aug 2018 14:10:30 -0400 Subject: [PATCH 088/310] show error if cropper fails --- public/language/en-GB/error.json | 1 + public/src/modules/pictureCropper.js | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index b44eb6e07c..e3cfab6efa 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -92,6 +92,7 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index 60e7f2708c..0fd58c334f 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -50,6 +50,7 @@ define('pictureCropper', ['translator', 'cropper', 'benchpress'], function (tran aspectRatio: data.aspectRatio, autoCropArea: 1, viewMode: 1, + checkCrossOrigin: false, cropmove: function () { if (data.restrictImageDimension) { if (cropperTool.cropBoxData.width > data.imageDimension) { @@ -96,7 +97,17 @@ define('pictureCropper', ['translator', 'cropper', 'benchpress'], function (tran cropperModal.find('.crop-btn').on('click', function () { $(this).addClass('disabled'); - var imageData = data.imageType ? cropperTool.getCroppedCanvas().toDataURL(data.imageType) : cropperTool.getCroppedCanvas().toDataURL(); + var imageData; + try { + imageData = data.imageType ? cropperTool.getCroppedCanvas().toDataURL(data.imageType) : cropperTool.getCroppedCanvas().toDataURL(); + } catch (err) { + if (err.message === 'Failed to execute \'toDataURL\' on \'HTMLCanvasElement\': Tainted canvases may not be exported.') { + app.alertError('[[error:cors-error]]'); + } else { + app.alertError(err.message); + } + return; + } cropperModal.find('#upload-progress-bar').css('width', '100%'); cropperModal.find('#upload-progress-box').show().removeClass('hide'); @@ -138,13 +149,10 @@ define('pictureCropper', ['translator', 'cropper', 'benchpress'], function (tran function onSubmit(data, callback) { function showAlert(type, message) { - module.hideAlerts(data.uploadModal); if (type === 'error') { data.uploadModal.find('#fileUploadSubmitBtn').removeClass('disabled'); } - data.uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); } - var fileInput = data.uploadModal.find('#fileInput'); if (!fileInput.val()) { return showAlert('error', '[[uploads:select-file-to-upload]]'); From c0156640e30222449e44d141b16a33b0eabf7133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 9 Aug 2018 14:26:24 -0400 Subject: [PATCH 089/310] add back alert --- public/src/modules/pictureCropper.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index 0fd58c334f..12491819aa 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -152,6 +152,7 @@ define('pictureCropper', ['translator', 'cropper', 'benchpress'], function (tran if (type === 'error') { data.uploadModal.find('#fileUploadSubmitBtn').removeClass('disabled'); } + data.uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); } var fileInput = data.uploadModal.find('#fileInput'); if (!fileInput.val()) { From e6ec041ddeb9d547d6116030366e8535d0ef2362 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 10 Aug 2018 12:04:47 -0400 Subject: [PATCH 090/310] bump composer-default --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3dc425aa01..e427532816 100644 --- a/install/package.json +++ b/install/package.json @@ -67,7 +67,7 @@ "mousetrap": "^1.6.1", "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", - "nodebb-plugin-composer-default": "6.0.29", + "nodebb-plugin-composer-default": "6.0.30", "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", From a77630c6beeb99427096f5e70b37b5ba89cfaa9a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 10 Aug 2018 14:22:28 -0400 Subject: [PATCH 091/310] closes #6697 --- public/src/client/topic/votes.js | 4 ++++ src/controllers/index.js | 1 + 2 files changed, 5 insertions(+) diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index ee4813d173..0c63fc47ed 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -72,6 +72,10 @@ define('forum/topic/votes', ['components', 'translator', 'benchpress'], function if (err) { app.alertError(err.message); } + + if (err.message === '[[error:not-logged-in]]') { + ajaxify.go('login'); + } }); return false; diff --git a/src/controllers/index.js b/src/controllers/index.js index a91636dfc7..f5e86c78f8 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -92,6 +92,7 @@ Controllers.login = function (req, res, next) { var allowLoginWith = (meta.config.allowLoginWith || 'username-email'); var returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url'), ''); + console.log('returnTo is', returnTo); var errorText; if (req.query.error === 'csrf-invalid') { From ed9dc113b01313ac33f2df1b79db01ac955ecd2e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 10 Aug 2018 15:01:45 -0400 Subject: [PATCH 092/310] sanitizing notes in flags details page, fixes #6698 --- src/flags.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/flags.js b/src/flags.js index 238bd7f204..0f056fa295 100644 --- a/src/flags.js +++ b/src/flags.js @@ -99,7 +99,10 @@ Flags.get = function (flagId, callback) { target_readable: data.base.type.charAt(0).toUpperCase() + data.base.type.slice(1) + ' ' + data.base.targetId, target: payload.targetObj, history: data.history, - notes: data.notes, + notes: data.notes.map((note) => { + note.content = validator.escape(note.content); + return note; + }), reporter: payload.userObj, })); }); From 731aa8912a3cf88ba19e877a5b7ac580bb5c9966 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 10 Aug 2018 17:43:16 +0000 Subject: [PATCH 093/310] Update dependency request to v2.88.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e427532816..72d8888ff2 100644 --- a/install/package.json +++ b/install/package.json @@ -91,7 +91,7 @@ "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", "redis": "2.8.0", - "request": "2.87.0", + "request": "2.88.0", "rimraf": "2.6.2", "rss": "^1.2.2", "sanitize-html": "^1.16.3", From f9d3484ec6b8fe741419100b15be7052d2ee6c90 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 10 Aug 2018 16:07:19 -0400 Subject: [PATCH 094/310] fixes #6543 --- src/user/profile.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/user/profile.js b/src/user/profile.js index cc55728d93..90bdfc7243 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -45,8 +45,6 @@ module.exports = function (User) { return updateUsername(updateUid, data.username, next); } else if (field === 'fullname') { return updateFullname(updateUid, data.fullname, next); - } else if (field === 'signature') { - data[field] = utils.stripHTMLTags(data[field]); } User.setUserField(updateUid, field, data[field], next); From f751d21d1e591e4acf989ea893988bac41499e7d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Aug 2018 12:06:53 -0400 Subject: [PATCH 095/310] removed debug line --- src/controllers/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index f5e86c78f8..a91636dfc7 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -92,7 +92,6 @@ Controllers.login = function (req, res, next) { var allowLoginWith = (meta.config.allowLoginWith || 'username-email'); var returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url'), ''); - console.log('returnTo is', returnTo); var errorText; if (req.query.error === 'csrf-invalid') { From 4627fc9cda595ff425ebb0a94d906bac8c928779 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 11 Aug 2018 09:00:23 +0000 Subject: [PATCH 096/310] Update node:8.11.3 Docker digest to 049869 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3084f1caf4..6cfbb53b39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # The base image is the latest 8.x node (LTS) -FROM node:8.11.3@sha256:deb6287c3b94e153933ed9422db4524d2ee41be00b32c88a7cd2d91d17bf8a5e +FROM node:8.11.3@sha256:04986974434fc565529feaac1d62cce4f9fe99ba4906f076ce498000120a45d4 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app From 904e3ff8e7ece007750bd17b418dd4e918b06b20 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 13 Aug 2018 09:14:48 +0000 Subject: [PATCH 097/310] Update dependency eslint-plugin-import to v2.14.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 72d8888ff2..acfb51565f 100644 --- a/install/package.json +++ b/install/package.json @@ -119,7 +119,7 @@ "coveralls": "3.0.2", "eslint": "4.19.1", "eslint-config-airbnb-base": "12.1.0", - "eslint-plugin-import": "2.13.0", + "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", "grunt-contrib-watch": "1.1.0", "jsdom": "11.11.0", From 772b5ee115d0ea77db6070599b5b88488cf1e7bc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 4 Aug 2018 03:53:48 +0000 Subject: [PATCH 098/310] Update dependency eslint to v5 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index acfb51565f..3112e48ea0 100644 --- a/install/package.json +++ b/install/package.json @@ -117,7 +117,7 @@ }, "devDependencies": { "coveralls": "3.0.2", - "eslint": "4.19.1", + "eslint": "5.3.0", "eslint-config-airbnb-base": "12.1.0", "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", From a84e6c40ae3389368ec2d82067dcadddbae50dfc Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 18 Jun 2018 22:28:31 +0000 Subject: [PATCH 099/310] Update dependency nyc to v12 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3112e48ea0..99a2615b47 100644 --- a/install/package.json +++ b/install/package.json @@ -125,7 +125,7 @@ "jsdom": "11.11.0", "mocha": "4.1.0", "mocha-lcov-reporter": "1.3.0", - "nyc": "11.9.0", + "nyc": "12.0.2", "smtp-server": "3.4.6" }, "bugs": { From aa1f881e88a2eb0473681426a9d2050227ad21b8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 18 Jun 2018 21:31:46 +0000 Subject: [PATCH 100/310] Update dependency mocha to v5 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 99a2615b47..cdbb679072 100644 --- a/install/package.json +++ b/install/package.json @@ -123,7 +123,7 @@ "grunt": "1.0.3", "grunt-contrib-watch": "1.1.0", "jsdom": "11.11.0", - "mocha": "4.1.0", + "mocha": "5.2.0", "mocha-lcov-reporter": "1.3.0", "nyc": "12.0.2", "smtp-server": "3.4.6" From 82e61d76fd9c22eeb37eb98df6f5c16eb8ecb147 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Aug 2018 12:54:38 -0400 Subject: [PATCH 101/310] bump markdown --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cdbb679072..2140bcf429 100644 --- a/install/package.json +++ b/install/package.json @@ -71,7 +71,7 @@ "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.4.4", + "nodebb-plugin-markdown": "8.5.0", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From 2ce6a8575656182c79b1ca5a0e432891a97a2df3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Aug 2018 14:17:51 -0400 Subject: [PATCH 102/310] properly closes #6698 --- src/flags.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/flags.js b/src/flags.js index 0f056fa295..a453dccf03 100644 --- a/src/flags.js +++ b/src/flags.js @@ -99,10 +99,7 @@ Flags.get = function (flagId, callback) { target_readable: data.base.type.charAt(0).toUpperCase() + data.base.type.slice(1) + ' ' + data.base.targetId, target: payload.targetObj, history: data.history, - notes: data.notes.map((note) => { - note.content = validator.escape(note.content); - return note; - }), + notes: data.notes, reporter: payload.userObj, })); }); @@ -323,6 +320,7 @@ Flags.getNotes = function (flagId, callback) { next(null, notes.map(function (note, idx) { note.user = users[idx]; + note.content = validator.escape(note.content); return note; })); }); From 560e63c97a5a91d0acfd2cab6d9713ea6a38df84 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 14 Aug 2018 09:29:37 +0000 Subject: [PATCH 103/310] Latest translations and fallbacks --- .../language/tr/admin/advanced/database.json | 6 ++-- public/language/tr/admin/extend/plugins.json | 6 ++-- .../language/tr/admin/general/dashboard.json | 10 +++--- .../language/tr/admin/manage/privileges.json | 8 ++--- public/language/tr/admin/manage/users.json | 32 +++++++++---------- public/language/tr/admin/menu.json | 12 +++---- .../language/tr/admin/settings/advanced.json | 12 +++---- .../tr/admin/settings/reputation.json | 4 +-- .../language/tr/admin/settings/uploads.json | 4 +-- public/language/tr/email.json | 4 +-- public/language/tr/error.json | 10 +++--- public/language/tr/groups.json | 2 +- public/language/tr/modules.json | 6 ++-- public/language/tr/pages.json | 12 +++---- public/language/tr/topic.json | 4 +-- public/language/tr/user.json | 12 +++---- 16 files changed, 72 insertions(+), 72 deletions(-) diff --git a/public/language/tr/admin/advanced/database.json b/public/language/tr/admin/advanced/database.json index ed181c34eb..49e18dcb26 100644 --- a/public/language/tr/admin/advanced/database.json +++ b/public/language/tr/admin/advanced/database.json @@ -29,8 +29,8 @@ "redis.memory-frag-ratio": "Bellek Parçalanma Oranı", "redis.total-connections-recieved": "Alınan Bağlantılar (Toplam)", "redis.total-commands-processed": "İşlenen Komutlar (Toplam)", - "redis.iops": "Instantaneous Ops. Per Second", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", + "redis.iops": "Saniyede işlenen komut sayısı (Redis)", + "redis.keyspace-hits": "Başarılı anahtar arama sayısı: keyspace_hits (Redis)", + "redis.keyspace-misses": "Başarısız anahtar arama sayısı: keyspace_misses (Redis)", "redis.raw-info": "İşlenmemiş Redis Bilgisi" } \ No newline at end of file diff --git a/public/language/tr/admin/extend/plugins.json b/public/language/tr/admin/extend/plugins.json index f9865adf47..b793391f6d 100644 --- a/public/language/tr/admin/extend/plugins.json +++ b/public/language/tr/admin/extend/plugins.json @@ -37,15 +37,15 @@ "alert.uninstalled": "Eklenti Kaldırıldı", "alert.activate-success": "Bu eklentiyi tamamen aktif edebilmek için lütfen NodeBB'yi yeniden başlatın", "alert.deactivate-success": "Eklenti başarıyla pasifleştirildi", - "alert.upgrade-success": "Please rebuild and restart your NodeBB to fully upgrade this plugin.", + "alert.upgrade-success": "Lütfen bu eklentiyi tamamen yükseltmek için NodeBB'nizi yeniden oluşturun ve yeniden başlatın.", "alert.install-success": "Eklenti başarıyla kuruldu, lütfen eklentiyi aktif edin.", "alert.uninstall-success": "Eklenti başarıyla pasifleştirildi ve kaldırıldı.", "alert.suggest-error": "

NodeBB paket yöneticisine ulaşamadı, en yeni sürüm yüklenmeye devam edilsin mi?

Sunucu iade etti (%1): %2
", "alert.package-manager-unreachable": "

NodeBB paket yöneticisine ulaşamadı, şu anda bir yükseltme önerilmedi.

", "alert.incompatible": "

NodeBB sürümünüz (v%1) bu eklentinin v%2 sürümüne yükseltilmesi için temizlendi. Bu eklentinin yeni versiyonunu yüklemek için lütfen NodeBB'yi güncelleyin.", "alert.possibly-incompatible": "

Uyumluluk Bilgisi Bulunamadı.

Bu eklenti, NodeBB sürümünüze göre kurulum için belirli bir sürümü belirtmedi. Tam uyumluluk garanti edilemez ve NodeBB'nizin artık düzgün çalışmamasına neden olabilir.

NodeBB düzgün şekilde önyükleme yapamıyorsa: $ ./nodebb reset plugin = \"%1\"

 

Bu eklentinin en yeni sürümünü yüklemeye devam et?

", - "alert.reorder": "Plugins Re-ordered", - "alert.reorder-success": "Please rebuild and restart your NodeBB to fully complete the process.", + "alert.reorder": "Sıralanmış Eklentiler", + "alert.reorder-success": "Lütfen işlemi tamamlamak için NodeBB'nizi yeniden oluşturun ve yeniden başlatın.", "license.title": "Eklenti Lisans Bilgisi", "license.intro": "% 1 eklentisi,% 2 altında lisanslanmıştır. Lütfen bu eklentiyi etkinleştirmeden önce lisans koşullarını okuyun ve anlayın.", diff --git a/public/language/tr/admin/general/dashboard.json b/public/language/tr/admin/general/dashboard.json index 5d7215a90d..37f1988895 100644 --- a/public/language/tr/admin/general/dashboard.json +++ b/public/language/tr/admin/general/dashboard.json @@ -24,10 +24,10 @@ "keep-updated": "En son güvenlik değişiklikleri ve hata düzeltmeleri için NodeBB'nin güncel olduğundan emin olun.", "up-to-date": "

Güncel

", "upgrade-available": "

Yeni bir sürüm (v% 1) yayınlandı. NodeBB yükseltmeyi gözden geçirin.

", - "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-upgrade-available": "

Bu, NodeBB'nin eski bir sürümü. Yeni bir sürüm (v% 1) yayınlandı. NodeBB’niziyükseltmeyi düşünün.

", "prerelease-warning": "

Bu, NodeBB'nin bir önsürüm versiyonudur. İstenmeyen hatalar oluşabilir.

", "running-in-development": "Forum, geliştirici modunda çalışıyor. Forum, potansiyel güvenlik açıklarına açık olabilir; lütfen sistem yöneticinize başvurun.", - "latest-lookup-failed": "

Failed to look up latest available version of NodeBB

", + "latest-lookup-failed": "

En son kullanılabilen NodeBB sürümü görüntülenemedi

", "notices": "Bildirimler", "restart-not-required": "Yeniden başlatma gerekmiyor", @@ -37,10 +37,10 @@ "search-plugin-tooltip": "Arama işlevselliğini etkinleştirmek için eklenti sayfasından bir arama eklentisi kurun", "control-panel": "Sistem Kontrol", - "rebuild-and-restart": "Rebuild & Restart", + "rebuild-and-restart": "Yeniden oluştur & Yeniden Başlat", "restart": "Yeniden Başlat", "restart-warning": "NodeBB'yi yeniden yapılandırmak veya yeniden başlatmak, mevcut tüm bağlantıları birkaç saniye için sonlandırır.", - "restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.", + "restart-disabled": "NodeBB'nizi yeniden oluşturma ve yeniden başlatma devre dışı bırakıldı.", "maintenance-mode": "Bakım Modu", "maintenance-mode-title": "NodeBB için bakım modunu ayarlamak için buraya tıklayın", "realtime-chart-updates": "Gerçek Zamanlı Grafik Güncellemeleri", @@ -69,5 +69,5 @@ "graphs.registered-users": "Kayıtlı Kullanıcılar", "graphs.anonymous-users": "Anonim Kullanıcılar", "last-restarted-by": "Son olarak yeniden başlatıldı", - "no-users-browsing": "No users browsing" + "no-users-browsing": "Gezen kullanıcı yok" } diff --git a/public/language/tr/admin/manage/privileges.json b/public/language/tr/admin/manage/privileges.json index ad1460e278..cd67bfb2a5 100644 --- a/public/language/tr/admin/manage/privileges.json +++ b/public/language/tr/admin/manage/privileges.json @@ -7,14 +7,14 @@ "upload-files": "Dosya Yükle", "signature": "İmza", "ban": "Ban", - "search-content": "Search Content", + "search-content": "İçerik Arama", "search-users": "Kullanıcıları Ara", "search-tags": "Etiketleri Ara", "find-category": "Kategori Bul", - "access-category": "Access Category", - "access-topics": "Access Topics", - "create-topics": "Create Topics", + "access-category": "Kategoriye Eriş", + "access-topics": "Başlıklara Eriş", + "create-topics": "Başlık Oluştur", "reply-to-topics": "Reply to Topics", "tag-topics": "Tag Topics", "edit-posts": "Edit Posts", diff --git a/public/language/tr/admin/manage/users.json b/public/language/tr/admin/manage/users.json index 0eca542d41..b00be66108 100644 --- a/public/language/tr/admin/manage/users.json +++ b/public/language/tr/admin/manage/users.json @@ -63,26 +63,26 @@ "temp-ban.days": "Gün", "temp-ban.explanation": "Yasağın süresini girin. 0'lık bir zamanın kalıcı bir yasak olarak sayılacağını unutmayın.", - "alerts.confirm-ban": "Do you really want to ban this user permanently?", - "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", + "alerts.confirm-ban": "Bu kullanıcıyı kalıcı olarak yasaklamak istiyor musunuz?", + "alerts.confirm-ban-multi": "Bu kullanıcıları kalıcı olarak yasaklamak istiyor musunuz?", "alerts.ban-success": "Kullanıcı(lar) yasaklandı!", - "alerts.button-ban-x": "Ban %1 user(s)", + "alerts.button-ban-x": "%1 kullanıcı(ları) yasakla", "alerts.unban-success": "Kullanıcı(ların) yasağı kaldırıldı!", - "alerts.lockout-reset-success": "Lockout(s) reset!", - "alerts.flag-reset-success": "Flags(s) reset!", + "alerts.lockout-reset-success": "Kilitleme(ler) sıfırlandı!", + "alerts.flag-reset-success": "Bayrak(lar) sıfırlandı!", "alerts.no-remove-yourself-admin": "Kendinizi Yönetici olarak kaldıramazsınız!", "alerts.make-admin-success": "Kullanıcı şimdi yönetici.", "alerts.confirm-remove-admin": "Bu yöneticiyi gerçekten kaldırmak istiyor musunuz?", "alerts.remove-admin-success": "Kullanıcı artık yönetici değil.", - "alerts.make-global-mod-success": "User is now global moderator.", - "alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?", - "alerts.remove-global-mod-success": "User is no longer global moderator.", - "alerts.make-moderator-success": "User is now moderator.", - "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", - "alerts.remove-moderator-success": "User is no longer moderator.", - "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", - "alerts.validate-email-success": "Emails validated", - "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", + "alerts.make-global-mod-success": "Kullanıcı artık genel moderatör.", + "alerts.confirm-remove-global-mod": "Bu genel moderatörü gerçekten çıkarmak istiyor musunuz?", + "alerts.remove-global-mod-success": "Kullanıcı artık genel moderatör değil.", + "alerts.make-moderator-success": "Kullanıcı artık moderatör.", + "alerts.confirm-remove-moderator": "Bu moderatörü gerçekten çıkarmak istiyor musunuz?", + "alerts.remove-moderator-success": "Kullanıcı artık moderatör değil.", + "alerts.confirm-validate-email": "Bu kullanıcının(ların) e-postasını(larını) doğrulamak istiyor musunuz?", + "alerts.validate-email-success": "E-postalar doğrulandı", + "alerts.password-reset-confirm": "Bu kullanıcıya(lara) şifre sıfırlama e-postası(ları) göndermek istiyor musunuz?", "alerts.confirm-delete": "Uyarı!
Kullanıcı(ları) silmeyi gerçekten istiyor musunuz?
Bu işlem geri alınamaz! Yalnızca kullanıcı hesapları silinecektir, iletiler ve konular kalacaktır.", "alerts.delete-success": "Kullanıcı(lar) Silindi!", "alerts.confirm-purge": "Uyarı!
Kullanıcı(ları) ve içeriklerini silmeyi gerçekten istiyor musunuz?
Bu işlem geri alınamaz! Tüm kullanıcı verileri ve içerikleri silinecektir.", @@ -90,10 +90,10 @@ "alerts.button-create": "Oluştur", "alerts.button-cancel": "İptal", "alerts.error-passwords-different": "Şifreler aynı olmalı!", - "alerts.error-x": "Error

%1

", + "alerts.error-x": "Hata

%1

", "alerts.create-success": "Kullanıcı oluşturuldu!", "alerts.prompt-email": "Eposta:", "alerts.email-sent-to": "%1'e bir davet e-postası gönderildi", - "alerts.x-users-found": "%1 user(s) found! Search took %2 ms." + "alerts.x-users-found": "(%1) kullanıcı bulundu! Arama süresi: %2 ms." } \ No newline at end of file diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index f6c7f29289..6c0df1b8cc 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -42,7 +42,7 @@ "section-appearance": "Görünüm", "appearance/themes": "Temalar", "appearance/skins": "Deriler", - "appearance/customise": "Custom Content (HTML/JS/CSS)", + "appearance/customise": "Özelleşmiş İçerik (HTML / JS / CSS)", "section-extend": "Genişletme", "extend/plugins": "Eklentiler", @@ -63,19 +63,19 @@ "development/logger": "Kaydedici", "development/info": "bilgi", - "rebuild-and-restart-forum": "Rebuild & Restart Forum", + "rebuild-and-restart-forum": "Forumu Yeniden oluştur & Yeniden Başlat", "restart-forum": "Forumu Yeniden Başlat", "logout": "Çıkış", "view-forum": "Forumu Görüntüle", "search.placeholder": "Ayarları ara", "search.no-results": "Sonuç yok...", - "search.search-forum": "Search the forum for ", + "search.search-forum": "Forumda ara: ", "search.keep-typing": "Sonuçları görmek için daha fazla yazın...", "search.start-typing": "Sonuçları görmek için yazmaya başlayın...", - "connection-lost": "Connection to %1 has been lost, attempting to reconnect...", + "connection-lost": "% 1 ile bağlantı kesildi, yeniden bağlanılmaya çalışılıyor...", - "alerts.version": "Running NodeBB v%1", - "alerts.upgrade": "Upgrade to v%1" + "alerts.version": "NodeBB v%1", + "alerts.upgrade": "Güncelle: v%1" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index d247a1e710..3c959f5b1c 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -6,16 +6,16 @@ "headers.allow-from": "NodeBB'yi bir iFrame'e yerleştirmek için ALLOW-FROM'u ayarla", "headers.powered-by": "NodeBB tarafından gönderilen \"Powered By\" başlığını özelleştirin", "headers.acao": "Erişim-Kontrolü-Kaynak-İzni", - "headers.acao-regex": "Access-Control-Allow-Origin Regular Expression", + "headers.acao-regex": "Erişim-Kontrolü-Kaynak-İzni Düzenli İfade", "headers.acao-help": "Tüm sitelere erişimi engellemek için boş bırakın", - "headers.acao-regex-help": "Enter regular expressions here to match dynamic origins. To deny access to all sites, leave empty", + "headers.acao-regex-help": "Dinamik kökenleri eşleştirmek için buraya düzenli ifadeler girin. Tüm sitelere erişimi reddetmek için boş bırakın", "headers.acac": "Erişim-Kontrolü-KimlikBilgileri-İzni", "headers.acam": "Erişim-Kontrolü-Yöntem-İzni", "headers.acah": "Erişim-Kontrolü-Başlık-İzni", - "hsts": "Strict Transport Security", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts": "STS", + "hsts.subdomains": "Alt alanları HSTS üstbilgisine ekle", + "hsts.preload": "HSTS üst bilgisinin ön yüklemesine izin ver", + "hsts.help": "Bu site için bir HSTS başlığı önceden yapılandırılmıştır. Alt alanları ve önyükleme bayraklarını dahil etmeyi seçebilirsiniz. Kararsızsanız, bu alanı işaretlenmemiş olarak bırakabilirsiniz. Daha fazla bilgi ", "traffic-management": "Trafik Yönetimi", "traffic.help": "NodeBB, yoğun trafik isteklerini otomatik olarak reddeden bir modül ile donatılmıştır. Varsayıla ayarlar başlangıç için yeterli olsa da, bu ayarları buradan düzenleyebilirsiniz.", "traffic.enable": "Trafik Yönetimini Etkinleştir", diff --git a/public/language/tr/admin/settings/reputation.json b/public/language/tr/admin/settings/reputation.json index ac662e26f5..dabd186539 100644 --- a/public/language/tr/admin/settings/reputation.json +++ b/public/language/tr/admin/settings/reputation.json @@ -9,6 +9,6 @@ "min-rep-website": "Kullanıcı profiline \"Web Sitesi\" eklemek için gerekli asgari itibar", "min-rep-aboutme": "Kullanıcı profiline \"Hakkımda\" eklemek için gereken asgari itibar", "min-rep-signature": "Kullanıcı profiline \"İmza\" eklemek için gerekli asgari itibar", - "min-rep-profile-picture": "Minimum reputation to add \"Profile Picture\" to user profile", - "min-rep-cover-picture": "Minimum reputation to add \"Cover Picture\" to user profile" + "min-rep-profile-picture": "Kullanıcı profiline \"Profil Resmi\" eklemek için gerekli asgari itibar", + "min-rep-cover-picture": "Kullanıcı profiline \"Kapak Resmi\" eklemek için gerekli asgari itibar" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/uploads.json b/public/language/tr/admin/settings/uploads.json index 4ff7dd7b9b..ceb47839cf 100644 --- a/public/language/tr/admin/settings/uploads.json +++ b/public/language/tr/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "İletiler", "allow-files": "Kullanıcıların normal dosyalar yüklemesine izin ver", "private": "Yüklenen dosyaları gizli yap", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "Gizli yapılacak dosya uzantıları", + "private-uploads-extensions-help": "Buraya gizli yapılacak dosya uzantıları listesini virgülle ayırarak giriniz. (ör. pdf,xls,doc). Boş bırakmak, tüm dosyaların gizli olacağı anlamına gelir.", "max-image-width": "Görüntüleri belirtilen genişliğe (piksel cinsinden) yeniden boyutlandır", "max-image-width-help": "(Piksel, varsayılan: 128 piksel, devre dışı bırakmak için 0'a ayarlayın)", "resize-image-quality": "Resimleri yeniden boyutlandırırken kullanılacak kalite", diff --git a/public/language/tr/email.json b/public/language/tr/email.json index aac994ca6f..91bb75faaa 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -4,8 +4,8 @@ "invite": "%1 sizi davet etti", "greeting_no_name": "Merhaba", "greeting_with_name": "Merhaba %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Lütfen e-posta adresinizi doğrulayın", + "email.verify.text1": "E-posta adresiniz değişti!", "welcome.text1": "Kaydolduğunuz için teşekkürler!", "welcome.text2": "Hesabınızı aktif hale getirmek için, kaydolduğunuz e-posta adresinin size ait olduğunu onaylamamız gerekiyor.", "welcome.text3": "Yönetici kayıt olma isteğinizi kabul etti. Kullanıcı adı/şifre ile giriş yapabilirsiniz.", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 1f28da25ca..e9e608184c 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -127,8 +127,8 @@ "not-enough-reputation-min-rep-website": "Bir website eklemek için yeterli saygınlığa sahip değilsin", "not-enough-reputation-min-rep-aboutme": "Hakkında kısmını doldurabilmek için yeterli saygınlığa sahip değilsin", "not-enough-reputation-min-rep-signature": "İmza eklemek için yeterli saygınlığa sahip değilsin", - "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture", - "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture", + "not-enough-reputation-min-rep-profile-picture": "Profil fotoğrafı eklemek için yeterli saygınlığa sahip değilsiniz", + "not-enough-reputation-min-rep-cover-picture": "Kapak fotoğrafı eklemek için yeterli saygınlığa sahip değilsiniz", "already-flagged": "Bu iletiyi zaten bayrakladınız", "self-vote": "Kendi iletinize oy veremezsiniz", "reload-failed": "NodeBB tekrar yüklenirken bir sorunla karşılaştı: “%1“. NodeBB varolan dosyaları servis etmeye devam edecek.", @@ -149,7 +149,7 @@ "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": "Hiçbir başlık seçilmedi!", "cant-move-to-same-topic": "İletiyi aynı başlığa taşıyamazsın!", - "cannot-block-self": "You cannot block yourself!", - "cannot-block-privileged": "You cannot block administrators or global moderators", - "no-connection": "There seems to be a problem with your internet connection" + "cannot-block-self": "Kendi kendinizi engelleyemezsiniz!", + "cannot-block-privileged": "Yöneticileri veya genel moderatörleri engelleyemezsiniz", + "no-connection": "İnternet bağlantınızda sorun var gibi görünüyor" } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index c31b39b418..6b960a2238 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -28,7 +28,7 @@ "details.grant": "Grup Sahibi Yap/Kaldır", "details.kick": "Dışarı at", "details.kick_confirm": "Bu üyeyi bu gruptan silmek istediğinden emin misin?", - "details.add-member": "Add Member", + "details.add-member": "Üye Ekle", "details.owner_options": "Grup Yöneticisi", "details.group_name": "Grup ismi", "details.member_count": "Üye Sayısı", diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index bcc332a749..1a8d931c07 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Bu mesajı silmek istediğinden emin misin?", "chat.retrieving-users": "Kullanıcılar alınıyor ...", "chat.manage-room": "Sohbet Odasını Yönet", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Burada kullanıcılar için arama yapın. Kullanıcı seçildiğinde sohbete eklenecektir. Yeni kullanıcı sohbete eklenmeden önce yazılmış olan sohbet mesajlarını göremeyecektir. Yalnızca oda sahipleri () kullanıcıları sohbet odalarından kaldırabilir.", "chat.confirm-chat-with-dnd-user": "Bu kullanıcı durumunu rahatsız etmeyin olarak ayarladı. Hala onunla sohbet etmek istiyor musun?", "chat.rename-room": "Odanın adını değiştir", "chat.rename-placeholder": "Oda isminizi buraya girin", @@ -32,8 +32,8 @@ "chat.leave-help": "Bu sohbetten ayrılmak, bu sohbetteki gelecekteki yazışmalardan sizi silecektir. Gelecekte tekrar eklendiyseniz, yeniden katılmadan önce herhangi bir sohbet geçmişi görmezsiniz.", "chat.in-room": "Bu odada", "chat.kick": "Dışarı At", - "chat.show-ip": "Show IP", - "chat.owner": "Room Owner", + "chat.show-ip": "IP Göster", + "chat.owner": "Oda Sahibi", "composer.compose": "Yaz", "composer.show_preview": "Önizleme Göster", "composer.hide_preview": "Önizleme Sakla", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index c503fae900..0bd1b804f5 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -6,10 +6,10 @@ "popular-month": "Bu ayki popüler başlıklar", "popular-alltime": "En popüler başlıklar", "recent": "Güncel Konular", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Bugün en çok oylanan başlıklar", + "top-week": "Bu hafta en çok oylanan başlıklar", + "top-month": "Bu ay en çok oylanan başlıklar", + "top-alltime": "En çok oylanan başlıklar", "moderator-tools": "Moderatör Araçları", "flagged-content": "Bayraklanan İçerik", "ip-blacklist": "IP Kara Listesi", @@ -52,8 +52,8 @@ "account/upvoted": "%1 tarafından artılanan gönderiler", "account/downvoted": "%1 tarafından eksilenen gönderiler", "account/best": "%1 tarafından en iyi gönderiler", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", + "account/blocks": "Engellenen kullanıcılar: %1", + "account/uploads": "Yüklendi: %1", "confirm": "E-posta Onaylandı", "maintenance.text": "%1 şu anda bakımda. Lütfen bir süre sonra tekrar deneyin.", "maintenance.messageIntro": "Ayrıca, yönetici şu mesaji bıraktı:", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index 4848578a19..691c7d4610 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -128,6 +128,6 @@ "diffs.title": "İleti Geçmiş Düzenle", "diffs.description": "Bu iletinin %1revizyonu var. Zaman içerisinde ileti içeriğinin tamamını görmek için aşağıdaki düzeltmelerden birine tıklayın.", "diffs.no-revisions-description": "Bu iletinin %1 revizyonu var.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.current-revision": "Mevcut revizyon", + "diffs.original-revision": "Orijinal revizyon" } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 6dd18cba2c..18e964fabe 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -31,8 +31,8 @@ "following": "Takip Ediyor", "blocks": "Blok", "block_toggle": "Blokta Geçiş Yap", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Kullanıcı Engelle", + "unblock_user": "Kullanıcı Engeli Kaldır", "aboutme": "Hakkımda", "signature": "İmza", "birthday": "Doğum Tarihi", @@ -111,7 +111,7 @@ "upvote-notif-freq.all": "Büyün Artı Oylar", "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Her Artı On Oy", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "10, 100, 1000...", "upvote-notif-freq.disabled": "Devre dışı", "browsing": "Tarayıcı Ayaları", @@ -159,13 +159,13 @@ "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", "consent.give": "İzin ver", - "consent.right_of_access": "You have the Right of Access", + "consent.right_of_access": "Erişim hakkına sahipsiniz", "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", "consent.right_to_rectification": "You have the Right to Rectification", "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", - "consent.right_to_erasure": "You have the Right to Erasure", + "consent.right_to_erasure": "Silme hakkına sahipsiniz", "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", + "consent.right_to_data_portability": "Veri taşıma hakkına sahipsiniz", "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", "consent.export_profile": "Profili Dışarı Çıkar (.csv)", "consent.export_uploads": "Karşıya Yüklenmiş İçeriği Dışarı Aktar (.zip)", From 12940b577b1e66dc94182b3adecc86f366133d2a Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Wed, 15 Aug 2018 20:42:59 -0400 Subject: [PATCH 104/310] closes #6703 --- .../en-GB/admin/manage/categories.json | 1 + public/src/admin/manage/categories.js | 13 ++++++ src/categories/create.js | 41 +++++++++++++++++-- .../admin/partials/categories/create.tpl | 5 +++ 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 2cd4914ce0..76504eec6f 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -78,12 +78,25 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri var formData = modal.find('form').serializeObject(); formData.description = ''; formData.icon = 'fa-comments'; + formData.uid = app.user.uid; Categories.create(formData); modal.modal('hide'); return false; } + $('#cloneChildren').on('change', function () { + var check = $(this); + var parentSelect = $('#parentCid'); + + if (check.prop('checked')) { + parentSelect.attr('disabled', 'disabled'); + parentSelect.val(''); + } else { + parentSelect.removeAttr('disabled'); + } + }); + modal.find('form').on('submit', submit); }); }); diff --git a/src/categories/create.js b/src/categories/create.js index 1d6fc6c09f..c4cf728701 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -84,10 +84,24 @@ module.exports = function (Categories) { ], next); }, function (results, next) { - if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { - return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next); - } - next(null, category); + async.series([ + function (next) { + if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { + return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next); + } + + next(); + }, + function (next) { + if (data.cloneChildren) { + return duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid, next); + } + + next(); + }, + ], function (err) { + next(err, category); + }); }, function (category, next) { plugins.fireHook('action:category.create', { category: category }); @@ -96,6 +110,25 @@ module.exports = function (Categories) { ], callback); }; + function duplicateCategoriesChildren(parentCid, cid, uid, callback) { + Categories.getChildren([cid], uid, function (err, children) { + if (err || !children.length) { + return callback(err); + } + + children = children[0]; + + children.forEach(function (child) { + child.parentCid = parentCid; + child.cloneFromCid = child.cid; + child.cloneChildren = true; + child.uid = uid; + }); + + async.each(children, Categories.create, callback); + }); + } + Categories.assignColours = function () { var backgrounds = ['#AB4642', '#DC9656', '#F7CA88', '#A1B56C', '#86C1B9', '#7CAFC2', '#BA8BAF', '#A16946']; var text = ['#fff', '#fff', '#333', '#fff', '#333', '#fff', '#fff', '#fff']; diff --git a/src/views/admin/partials/categories/create.tpl b/src/views/admin/partials/categories/create.tpl index 436705b1d8..7fb0f2484b 100644 --- a/src/views/admin/partials/categories/create.tpl +++ b/src/views/admin/partials/categories/create.tpl @@ -21,5 +21,10 @@ + +
\ No newline at end of file From 6a0755ee321c952c2eb6f11f9a91e362283b9376 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 16 Aug 2018 08:52:06 +0000 Subject: [PATCH 105/310] Update Node.js to v8.11.4 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6cfbb53b39..687c9043ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # The base image is the latest 8.x node (LTS) -FROM node:8.11.3@sha256:04986974434fc565529feaac1d62cce4f9fe99ba4906f076ce498000120a45d4 +FROM node:8.11.4@sha256:cd8ebd022c01f519eb58a98fcbb05c1d1195ac356ef01851036671ec9e9d5580 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app From 85eef740a8ad08f65df77b093d79e50da9a143b8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 17 Aug 2018 02:42:37 +0000 Subject: [PATCH 106/310] Update dependency validator to v10.6.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 2140bcf429..a7151951d3 100644 --- a/install/package.json +++ b/install/package.json @@ -109,7 +109,7 @@ "spider-detector": "1.0.18", "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", - "validator": "10.5.0", + "validator": "10.6.0", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "^4.1.1", From df4c90dc7801717206a88c69c111ddf431c6c121 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 17 Aug 2018 10:31:52 -0400 Subject: [PATCH 107/310] bump markdown --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index a7151951d3..947ddf5b96 100644 --- a/install/package.json +++ b/install/package.json @@ -71,7 +71,7 @@ "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.5.0", + "nodebb-plugin-markdown": "8.5.1", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From e7a3dac10b8a129fe9e39a09c05bce6306997c90 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 17 Aug 2018 11:18:33 -0400 Subject: [PATCH 108/310] bump markdown again --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 947ddf5b96..3a61f6fd66 100644 --- a/install/package.json +++ b/install/package.json @@ -71,7 +71,7 @@ "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.5.1", + "nodebb-plugin-markdown": "8.6.0", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From 18a875c51da50988c4f27a3e4634a0787a394e64 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 17 Aug 2018 12:01:11 -0400 Subject: [PATCH 109/310] bump markdown --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3a61f6fd66..6185b5b12e 100644 --- a/install/package.json +++ b/install/package.json @@ -71,7 +71,7 @@ "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.6.0", + "nodebb-plugin-markdown": "8.6.1", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From ae4016d9e0fe7989d9ea59cbfb0c5e7a6dad2c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 17 Aug 2018 16:39:50 -0400 Subject: [PATCH 110/310] add getCateries to helpers --- src/controllers/helpers.js | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 4b41c62dfb..301c298fe1 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -12,6 +12,7 @@ var categories = require('../categories'); var plugins = require('../plugins'); var meta = require('../meta'); var middleware = require('../middleware'); +var utils = require('../utils'); var helpers = module.exports; @@ -227,15 +228,34 @@ helpers.buildTitle = function (pageTitle) { return title; }; +helpers.getCategories = function (set, uid, privilege, selectedCid, callback) { + async.waterfall([ + function (next) { + categories.getCidsByPrivilege(set, uid, privilege, next); + }, + function (cids, next) { + getCategoryData(cids, uid, selectedCid, next); + }, + ], callback); +}; + helpers.getWatchedCategories = function (uid, selectedCid, callback) { - if (selectedCid && !Array.isArray(selectedCid)) { - selectedCid = [selectedCid]; - } async.waterfall([ function (next) { user.getWatchedCategories(uid, next); }, function (cids, next) { + getCategoryData(cids, uid, selectedCid, next); + }, + ], callback); +}; + +function getCategoryData(cids, uid, selectedCid, callback) { + if (selectedCid && !Array.isArray(selectedCid)) { + selectedCid = [selectedCid]; + } + async.waterfall([ + function (next) { privileges.categories.filterCids('read', cids, uid, next); }, function (cids, next) { @@ -249,6 +269,7 @@ helpers.getWatchedCategories = function (uid, selectedCid, callback) { var selectedCids = []; categoryData.forEach(function (category) { category.selected = selectedCid ? selectedCid.indexOf(String(category.cid)) !== -1 : false; + category.parentCid = category.hasOwnProperty('parentCid') && utils.isNumber(category.parentCid) ? category.parentCid : 0; if (category.selected) { selectedCategory.push(category); selectedCids.push(parseInt(category.cid, 10)); @@ -280,7 +301,7 @@ helpers.getWatchedCategories = function (uid, selectedCid, callback) { next(null, { categories: categoriesData, selectedCategory: selectedCategory, selectedCids: selectedCids }); }, ], callback); -}; +} function recursive(category, categoriesData, level) { category.level = level; From ff593607faaed2907f3aa902fe6e0f8a71ab0822 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 18 Aug 2018 02:15:18 +0000 Subject: [PATCH 111/310] Update dependency eslint to v5.4.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 6185b5b12e..b096cb98d2 100644 --- a/install/package.json +++ b/install/package.json @@ -117,7 +117,7 @@ }, "devDependencies": { "coveralls": "3.0.2", - "eslint": "5.3.0", + "eslint": "5.4.0", "eslint-config-airbnb-base": "12.1.0", "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", From 3c6327215cc5bc265cd00544f3ae2cb6bdfa54b5 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 18 Aug 2018 04:45:54 +0000 Subject: [PATCH 112/310] Latest translations and fallbacks --- .../language/tr/admin/manage/categories.json | 22 ++++++++-------- .../language/tr/admin/manage/privileges.json | 26 +++++++++---------- public/language/tr/admin/settings/post.json | 12 ++++----- public/language/tr/user.json | 24 ++++++++--------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 7d3fd518ba..6f9c1b3bfb 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -29,7 +29,7 @@ "set-parent-category": "Ana Kategori Ayarla", "privileges.description": "Bu kategorideki erişim denetimi ayrıcalıklarını bu bölümde yapılandırabilirsiniz. Ayrıcalıklar kullanıcıya veya gruba göre verilebilir. Bu tabloda, aşağıdaki formdan arama yapabilir, yeni bir kullanıcı ekleyebilirsiniz.", - "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", + "privileges.warning": "Not: Ayrıcalık ayarları hemen yürürlüğe girer. Bu ayarları yaptıktan sonra kategoriyi kaydetmek gerekli değildir.", "privileges.section-viewing": "Ayrıcalıkları Görüntüle", "privileges.section-posting": "Gönderme Ayrıcalıkları", "privileges.section-moderation": "Moderatörlük Ayrıcalıkları", @@ -39,28 +39,28 @@ "privileges.section-group": "Grup", "privileges.group-private": "Bu grup gizlidir", "privileges.search-group": "Grup Ekle", - "privileges.copy-to-children": "Copy to Children", + "privileges.copy-to-children": "Alttakilere Kopyala", "privileges.copy-from-category": "Kategoriden Kopyala", - "privileges.inherit": "If the registered-users group is granted a specific privilege, all other groups receive an implicit privilege, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the registered-users user group, and so, privileges for additional groups need not be explicitly granted.", + "privileges.inherit": "Kayıtlı kullanıcı grubuna belirli bir ayrıcalık tanınması durumunda, diğer tüm gruplar açıkça tanımlanmamış / kontrol edilmemiş olsalar bile örtük bir ayrıcalık alırlar. Bu örtük ayrıcalık size gösterilir. Tüm kullanıcılar kayıtlı kullanıcılar grubunun bir parçasıdır. Bu nedenle ek gruplara yönelik ayrıcalıkların açıkça verilmesine gerek yoktur.", "analytics.back": "Kategori listesine geri dön", - "analytics.title": "Analytics for \"%1\" category", - "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", - "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", - "analytics.topics-daily": "Figure 3 – Daily topics created in this category", - "analytics.posts-daily": "Figure 4 – Daily posts made in this category", + "analytics.title": "\"%1\" kategorisi için analiz", + "analytics.pageviews-hourly": "Şekil 1 – Bu kategori için saatlik sayfa görüntüleme sayısı", + "analytics.pageviews-daily": "Şekil 2 – Bu kategori için günlük sayfa görüntüleme sayısı", + "analytics.topics-daily": "Şekil 3 – Bu kategoride oluşturulan günlük konular", + "analytics.posts-daily": "Şekil 4 – Bu kategoride oluşturulan günlük iletiler", "alert.created": "Yaratıldı", "alert.create-success": "Kategori başarıyla yaratıldı!", "alert.none-active": "Aktif kategoriniz mevcut değil.", "alert.create": "Bir Kategori Yarat", - "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", - "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", + "alert.confirm-moderate": "Bu kullanıcı grubuna moderatör ayrıcalığı vermek istediğinizden emin misiniz? Bu grup herkese açıktır ve herhangi bir kullanıcı isteğine katılabilir.", + "alert.confirm-purge": "

\"% 1\" kategorisini gerçekten temizlemek istiyor musunuz?

Uyarı! Bu kategorideki tüm başlıklar ve iletiler temizlenir!

Bir kategoriyi temizlemek, tüm başlıkları ve iletileri kaldıracak ve kategoriyi veritabanından silecektir. Bir kategoriyi geçici olarak kaldırmak isterseniz, kategoriyi \"devre dışı\" bırakmanız yeterlidir.

", "alert.purge-success": "Kategori temizlendi!", "alert.copy-success": "Ayarlar Kopyalandı!", "alert.set-parent-category": "Ana Kategori Ayarla", "alert.updated": "Güncellenen Kategoriler", - "alert.updated-success": "Category IDs %1 successfully updated.", + "alert.updated-success": "Kategori IDleri % 1 başarıyla güncellendi.", "alert.upload-image": "Kategori görseli yükle", "alert.find-user": "Bir Kullanıcı Ara", "alert.user-search": "Burada bir kullanıcı ara...", diff --git a/public/language/tr/admin/manage/privileges.json b/public/language/tr/admin/manage/privileges.json index cd67bfb2a5..495b555057 100644 --- a/public/language/tr/admin/manage/privileges.json +++ b/public/language/tr/admin/manage/privileges.json @@ -1,6 +1,6 @@ { - "global": "Global", - "global.no-users": "No user-specific global privileges.", + "global": "Genel", + "global.no-users": "Kullanıcıya özel genel ayrıcalık yok.", "chat": "Sohbet", "upload-images": "Resim Yükle", @@ -15,15 +15,15 @@ "access-category": "Kategoriye Eriş", "access-topics": "Başlıklara Eriş", "create-topics": "Başlık Oluştur", - "reply-to-topics": "Reply to Topics", - "tag-topics": "Tag Topics", - "edit-posts": "Edit Posts", - "view-edit-history": "View Edit History", - "delete-posts": "Delete Posts", - "view_deleted": "View Deleted Posts", - "upvote-posts": "Upvote Posts", - "downvote-posts": "Downvote Posts", - "delete-topics": "Delete Topics", - "purge": "Purge", - "moderate": "Moderate" + "reply-to-topics": "Başlığı Cevapla", + "tag-topics": "Başlığı etiketle", + "edit-posts": "İletiyi düzenle", + "view-edit-history": "Düzenleme Geçmişini Görüntüle", + "delete-posts": "İletileri Sil", + "view_deleted": "Silinen İletileri Görüntüle", + "upvote-posts": "İletilere Artı Oy Ver", + "downvote-posts": "İletilere Eksi Oy Ver", + "delete-topics": "Başlıkları Sil", + "purge": "Temizle", + "moderate": "Moderasyon" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/post.json b/public/language/tr/admin/settings/post.json index cd28316edd..f76d9db06e 100644 --- a/public/language/tr/admin/settings/post.json +++ b/public/language/tr/admin/settings/post.json @@ -27,11 +27,11 @@ "restrictions.days-until-stale": "Konu eskimiş sayılana kadar geçen gün sayısı", "restrictions.stale-help": "Bir konu \"eskimiş\" olarak kabul edilirse, o konuya cevap vermeye çalışan kullanıcılara bir uyarı gösterilecektir.", "timestamp": "Zaman Damgası", - "timestamp.cut-off": "Date cut-off (in days)", - "timestamp.cut-off-help": "Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).
(Default: 30, or one month). Set to 0 to always display dates, leave blank to always display relative times.", - "teaser": "Teaser Post", - "teaser.last-post": "Last – Show the latest post, including the original post, if no replies", - "teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies", + "timestamp.cut-off": "Kapanış tarihi (günler)", + "timestamp.cut-off-help": "Tarihler ve & zamanlar göreli bir şekilde (ör. \"3 saat önce\" / \"5 gün önce\") gösterilecek ve çeşitli dillerde yerleştirilecektir.\n\t\t\t\t\tBelirli bir noktadan sonra, bu metin yerelleştirilmiş tarihi göstermek için değiştirilebilir.\n\t\t\t\t\t(ör. 5 Kasım 2016 15:30).
(Varsayılan: 30, veya bir ay). Tarihleri her zaman görüntülemek için 0'a ayarlayın, her zaman göreli zamanları görüntülemek için boş bırakın.", + "teaser": "Teaser İleti", + "teaser.last-post": "Son – cevap yoksa orijinal gönderi de dahil olmak üzere en son gönderiyi gösterir.", + "teaser.last-reply": "Son – cevap yoksa en son yanıtı veya \"Yanıt yok\" yertutucusunu gösterir.", "teaser.first": "İlk", "unread": "Okunmamış Ayarları", "unread.cutoff": "Okunmamış gün sınırı", @@ -44,7 +44,7 @@ "signature.no-images": "İmzalarda resimleri devre dışı bırak", "signature.max-length": "Maksimum İmza Uzunluğu", "composer": "Yazar Ayarları", - "composer-help": "The following settings govern the functionality and/or appearance of the post composer shown\n\t\t\t\tto users when they create new topics, or reply to existing topics.", + "composer-help": "Aşağıdaki ayarlar, yeni konular oluşturduklarında veya mevcut konulara cevap verdiklerinde kullanıcıların \n\t\t\t\tyazı alanının işlevselliğini ve / veya görünümünü yönetmelerini sağlar.", "composer.show-help": "\"Yardım\" sekmesini göster", "composer.enable-plugin-help": "Eklentilerin yardım sekmesine içerik eklemesine izin ver", "composer.custom-help": "Özel Yardım Metni", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 18e964fabe..8e381cec73 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -109,7 +109,7 @@ "no-sound": "Ses yok", "upvote-notif-freq": "Artı Oy Bildiri Sıklığı", "upvote-notif-freq.all": "Büyün Artı Oylar", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "İleti Başına İlk", "upvote-notif-freq.everyTen": "Her Artı On Oy", "upvote-notif-freq.threshold": "1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "10, 100, 1000...", @@ -152,21 +152,21 @@ "info.moderation-note.add": "Not ekle", "consent.title": "Haklarınız & İzinleriniz", "consent.lead": "Bu topluluk forumu kişisel bilgilerinizi toplar ve işler.", - "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", - "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", - "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", - "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", - "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", - "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", + "consent.intro": "Bu bilgileri kesinlikle bu topluluktaki deneyiminizi kişiselleştirmek ve kullanıcı hesabınıza yaptığınız yayınları ilişkilendirmek için kullanıyoruz. Kayıt adımı sırasında sizden bir kullanıcı adı ve e-posta adresi vermeniz istenmiştir. Ayrıca, kullanıcı profilinizi bu web sitesinde tamamlamak için isteğe bağlı olarak ek bilgi de ekleyebilirsiniz.

Bu bilgileri kullanıcı hesabınızın ömrü boyunca saklayabilir ve izinleri geri alabilirsiniz. Hesabınızı istediğiniz zaman silebilirsiniz. Herhangi bir zamanda, bu web sitesine yaptığınız katkıların bir kopyasını Haklar & Onay sayfasını talep edebilirsiniz.

Sorularınız veya endişeleriniz varsa, bu forumun yönetim ekibine ulaşmanızı öneririz.", + "consent.email_intro": "Zaman zaman, güncellemeler ve / veya size uygun yeni etkinlikleri bildirmek için kayıtlı adresinize e-posta gönderebiliriz. Topluluk özetlemesinin sıklığını (tam olarak devre dışı bırakma dahil) özelleştirebilir, ayrıca kullanıcı ayarları sayfanız aracılığıyla e-posta yoluyla hangi bildirim türlerini alacağınızı seçebilirsiniz.", + "consent.digest_frequency": "Kullanıcı ayarlarınızda açıkça değiştirilmedikçe, bu topluluk her %1 e-posta özetini gönderir.", + "consent.digest_off": "Kullanıcı ayarlarınızda açıkça değiştirilmedikçe, bu topluluk e-posta özetlerini göndermez", + "consent.received": "Bilgilerinizi toplamak ve işlemek için bu web sitesine izin vermiş bulunuyorsunuz. Ek işlem gerekli değildir.", + "consent.not_received": "Veri toplama ve işleme için onay vermediniz. Herhangi bir zamanda, bu web sitesi yönetimi, Genel Veri Koruma Yönetmeliğine uymak için hesabınızı silmeyi seçebilir.", "consent.give": "İzin ver", "consent.right_of_access": "Erişim hakkına sahipsiniz", - "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", - "consent.right_to_rectification": "You have the Right to Rectification", - "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", + "consent.right_of_access_description": "Bu web sitesi tarafından toplanan herhangi bir veriye istek üzerine erişim hakkına sahipsiniz. Aşağıdaki uygun düğmeyi tıklayarak bu verilerin bir kopyasını alabilirsiniz.", + "consent.right_to_rectification": "Düzeltme hakkına sahipsiniz", + "consent.right_to_rectification_description": "Bize verilen yanlış verileri değiştirme veya güncelleme hakkına sahipsiniz. Profiliniz, profilinizi düzenleyerek güncellenebilir ve içerik yayınlamak her zaman düzenlenebilir. Durum böyle değilse, lütfen bu sitenin yönetim ekibiyle iletişime geçin.", "consent.right_to_erasure": "Silme hakkına sahipsiniz", - "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", + "consent.right_to_erasure_description": "Herhangi bir zamanda, hesabınızı silerek veri toplama ve / veya işlemeye onayınızı iptal edebilirsiniz. Gönderilen içeriğiniz kalsa da, bireysel profiliniz silinebilir. Hem hesabınızı hem de içeriğinizi silmek isterseniz, lütfen bu web sitesi için yönetim ekibine başvurun.", "consent.right_to_data_portability": "Veri taşıma hakkına sahipsiniz", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", + "consent.right_to_data_portability_description": "Sizden ve hesabınız hakkında toplanan verilere makine tarafından okunabilir bir veri talep edebilirsiniz. Aşağıdaki uygun düğmeyi tıklayarak bunu yapabilirsiniz.", "consent.export_profile": "Profili Dışarı Çıkar (.csv)", "consent.export_uploads": "Karşıya Yüklenmiş İçeriği Dışarı Aktar (.zip)", "consent.export_posts": "Gönderileri Dışa Aktar (.csv)" From ff3605fe78c0bf5ea0ec36c34664106ab5af9190 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 20 Aug 2018 11:08:59 -0400 Subject: [PATCH 113/310] bump markdown --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b096cb98d2..91cb3ed6d7 100644 --- a/install/package.json +++ b/install/package.json @@ -71,7 +71,7 @@ "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.6.1", + "nodebb-plugin-markdown": "8.7.2", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From af55a0512230f0b9873e1d7d2f0418335d84e1d7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Aug 2018 11:26:38 -0400 Subject: [PATCH 114/310] bump composer --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 91cb3ed6d7..d0c3ef5671 100644 --- a/install/package.json +++ b/install/package.json @@ -67,7 +67,7 @@ "mousetrap": "^1.6.1", "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", - "nodebb-plugin-composer-default": "6.0.30", + "nodebb-plugin-composer-default": "6.1.0", "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", From e4f0e59c7ba4e5f952c2bf7bba2fb1400780a117 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Aug 2018 11:37:19 -0400 Subject: [PATCH 115/310] bump composer again --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index d0c3ef5671..53c4f10b94 100644 --- a/install/package.json +++ b/install/package.json @@ -67,7 +67,7 @@ "mousetrap": "^1.6.1", "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", - "nodebb-plugin-composer-default": "6.1.0", + "nodebb-plugin-composer-default": "6.1.1", "nodebb-plugin-dbsearch": "2.0.19", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", From 3124cb37db02f227543b745bc34a5766424e78dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Aug 2018 15:37:34 -0400 Subject: [PATCH 116/310] closes #6712 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 53c4f10b94..edb4bde308 100644 --- a/install/package.json +++ b/install/package.json @@ -68,7 +68,7 @@ "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", "nodebb-plugin-composer-default": "6.1.1", - "nodebb-plugin-dbsearch": "2.0.19", + "nodebb-plugin-dbsearch": "2.0.20", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.7.2", From ebe85934219f1e6478e802ece5816869dbcc5a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Aug 2018 16:04:56 -0400 Subject: [PATCH 117/310] up dbsearch --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index edb4bde308..3ba00fc4d1 100644 --- a/install/package.json +++ b/install/package.json @@ -68,7 +68,7 @@ "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", "nodebb-plugin-composer-default": "6.1.1", - "nodebb-plugin-dbsearch": "2.0.20", + "nodebb-plugin-dbsearch": "2.0.21", "nodebb-plugin-emoji": "^2.2.4", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.7.2", From 70f04bd1c28b5243fdb9052e800e607b1ed51abf Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Aug 2018 22:30:30 -0400 Subject: [PATCH 118/310] fixed client-side console error on vote --- public/src/client/topic/votes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index 0c63fc47ed..1d17e03d46 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -73,7 +73,7 @@ define('forum/topic/votes', ['components', 'translator', 'benchpress'], function app.alertError(err.message); } - if (err.message === '[[error:not-logged-in]]') { + if (err && err.message === '[[error:not-logged-in]]') { ajaxify.go('login'); } }); From 8f724d7611d15b153d5db61040c9fdfaf9b38711 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 22 Aug 2018 23:46:01 +0000 Subject: [PATCH 119/310] Update dependency archiver to v3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3ba00fc4d1..7a68302d8e 100644 --- a/install/package.json +++ b/install/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "ace-builds": "^1.2.9", - "archiver": "^2.1.1", + "archiver": "^3.0.0", "async": "2.6.1", "autoprefixer": "^9.0.0", "bcryptjs": "2.4.3", From 9d202d9be938168bef064e0e8b22033aa0c2b66f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 Aug 2018 10:02:52 -0400 Subject: [PATCH 120/310] closes #424 --- install/package.json | 2 +- public/src/modules/chat.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 7a68302d8e..e3df3900d7 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.25", + "nodebb-theme-persona": "9.0.26", "nodebb-theme-slick": "1.2.9", "nodebb-theme-vanilla": "10.1.0", "nodebb-widget-essentials": "4.0.7", diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 0e916cc407..aae5456bed 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -136,7 +136,8 @@ define('chat', [ rooms: rooms, }, function (html) { translator.translate(html, function (translated) { - chatsListEl.empty().html(translated); + chatsListEl.find('*').not('.navigation-link').remove(); + chatsListEl.prepend(translated); app.createUserTooltips(chatsListEl, 'right'); }); }); From 33020b1ee08e2f32638929cbaa76e86945282410 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 24 Aug 2018 06:11:42 +0000 Subject: [PATCH 121/310] Update dependency validator to v10.7.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e3df3900d7..e937099b85 100644 --- a/install/package.json +++ b/install/package.json @@ -109,7 +109,7 @@ "spider-detector": "1.0.18", "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", - "validator": "10.6.0", + "validator": "10.7.0", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "^4.1.1", From cf82407a8f559d444d5d11536c052ec812b20755 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 24 Aug 2018 14:54:08 -0400 Subject: [PATCH 122/310] moved filter:post.getPostSummaryByPids to before parsePosts call /@pitaj --- src/posts/summary.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/posts/summary.js b/src/posts/summary.js index 139fea16a8..24090a01ee 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -78,13 +78,16 @@ module.exports = function (Posts) { return results.topics[post.tid]; }); - parsePosts(posts, options, next); + next(null, posts); }, function (posts, next) { plugins.fireHook('filter:post.getPostSummaryByPids', { posts: posts, uid: uid }, next); }, function (data, next) { - next(null, data.posts); + parsePosts(data.posts, options, next); + }, + function (posts, next) { + next(null, posts); }, ], callback); }; From badb06a9deba04f6bdfb5d55e6afce0ab4c6865c Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 25 Aug 2018 09:31:07 +0000 Subject: [PATCH 123/310] Latest translations and fallbacks --- public/language/ar/admin/advanced/database.json | 8 ++++++-- public/language/ar/admin/manage/categories.json | 1 + public/language/ar/admin/settings/advanced.json | 3 ++- public/language/ar/admin/settings/pagination.json | 3 +-- public/language/ar/error.json | 1 + public/language/ar/global.json | 1 + public/language/bg/admin/advanced/database.json | 8 ++++++-- public/language/bg/admin/manage/categories.json | 1 + public/language/bg/admin/settings/advanced.json | 3 ++- public/language/bg/admin/settings/pagination.json | 3 +-- public/language/bg/error.json | 1 + public/language/bg/global.json | 1 + public/language/bn/admin/advanced/database.json | 8 ++++++-- public/language/bn/admin/manage/categories.json | 1 + public/language/bn/admin/settings/advanced.json | 3 ++- public/language/bn/admin/settings/pagination.json | 3 +-- public/language/bn/error.json | 1 + public/language/bn/global.json | 1 + public/language/cs/admin/advanced/database.json | 8 ++++++-- public/language/cs/admin/manage/categories.json | 1 + public/language/cs/admin/settings/advanced.json | 3 ++- public/language/cs/admin/settings/pagination.json | 3 +-- public/language/cs/error.json | 1 + public/language/cs/global.json | 1 + public/language/da/admin/advanced/database.json | 8 ++++++-- public/language/da/admin/manage/categories.json | 1 + public/language/da/admin/settings/advanced.json | 3 ++- public/language/da/admin/settings/pagination.json | 3 +-- public/language/da/error.json | 1 + public/language/da/global.json | 1 + public/language/de/admin/advanced/database.json | 8 ++++++-- public/language/de/admin/manage/categories.json | 1 + public/language/de/admin/settings/advanced.json | 3 ++- public/language/de/admin/settings/pagination.json | 3 +-- public/language/de/error.json | 1 + public/language/de/global.json | 1 + public/language/el/admin/advanced/database.json | 8 ++++++-- public/language/el/admin/manage/categories.json | 1 + public/language/el/admin/settings/advanced.json | 3 ++- public/language/el/admin/settings/pagination.json | 3 +-- public/language/el/error.json | 1 + public/language/el/global.json | 1 + public/language/en-US/admin/advanced/database.json | 8 ++++++-- public/language/en-US/admin/manage/categories.json | 1 + public/language/en-US/admin/settings/advanced.json | 3 ++- public/language/en-US/admin/settings/pagination.json | 3 +-- public/language/en-US/error.json | 1 + public/language/en-US/global.json | 1 + public/language/en-x-pirate/admin/advanced/database.json | 8 ++++++-- public/language/en-x-pirate/admin/manage/categories.json | 1 + public/language/en-x-pirate/admin/settings/advanced.json | 3 ++- .../language/en-x-pirate/admin/settings/pagination.json | 3 +-- public/language/en-x-pirate/error.json | 1 + public/language/en-x-pirate/global.json | 1 + public/language/es/admin/advanced/database.json | 8 ++++++-- public/language/es/admin/manage/categories.json | 1 + public/language/es/admin/settings/advanced.json | 3 ++- public/language/es/admin/settings/pagination.json | 3 +-- public/language/es/error.json | 1 + public/language/es/global.json | 1 + public/language/et/admin/advanced/database.json | 8 ++++++-- public/language/et/admin/manage/categories.json | 1 + public/language/et/admin/settings/advanced.json | 3 ++- public/language/et/admin/settings/pagination.json | 3 +-- public/language/et/error.json | 1 + public/language/et/global.json | 1 + public/language/fa-IR/admin/advanced/database.json | 8 ++++++-- public/language/fa-IR/admin/manage/categories.json | 1 + public/language/fa-IR/admin/settings/advanced.json | 3 ++- public/language/fa-IR/admin/settings/pagination.json | 3 +-- public/language/fa-IR/error.json | 1 + public/language/fa-IR/global.json | 1 + public/language/fi/admin/advanced/database.json | 8 ++++++-- public/language/fi/admin/manage/categories.json | 1 + public/language/fi/admin/settings/advanced.json | 3 ++- public/language/fi/admin/settings/pagination.json | 3 +-- public/language/fi/error.json | 1 + public/language/fi/global.json | 1 + public/language/fr/admin/advanced/database.json | 8 ++++++-- public/language/fr/admin/manage/categories.json | 1 + public/language/fr/admin/settings/advanced.json | 3 ++- public/language/fr/admin/settings/pagination.json | 3 +-- public/language/fr/error.json | 1 + public/language/fr/global.json | 1 + public/language/gl/admin/advanced/database.json | 8 ++++++-- public/language/gl/admin/manage/categories.json | 1 + public/language/gl/admin/settings/advanced.json | 3 ++- public/language/gl/admin/settings/pagination.json | 3 +-- public/language/gl/error.json | 1 + public/language/gl/global.json | 1 + public/language/he/admin/advanced/database.json | 8 ++++++-- public/language/he/admin/manage/categories.json | 1 + public/language/he/admin/settings/advanced.json | 3 ++- public/language/he/admin/settings/pagination.json | 3 +-- public/language/he/error.json | 1 + public/language/he/global.json | 1 + public/language/hr/admin/advanced/database.json | 8 ++++++-- public/language/hr/admin/manage/categories.json | 1 + public/language/hr/admin/settings/advanced.json | 3 ++- public/language/hr/admin/settings/pagination.json | 3 +-- public/language/hr/error.json | 1 + public/language/hr/global.json | 1 + public/language/hu/admin/advanced/database.json | 8 ++++++-- public/language/hu/admin/manage/categories.json | 1 + public/language/hu/admin/settings/advanced.json | 3 ++- public/language/hu/admin/settings/pagination.json | 3 +-- public/language/hu/error.json | 1 + public/language/hu/global.json | 1 + public/language/id/admin/advanced/database.json | 8 ++++++-- public/language/id/admin/manage/categories.json | 1 + public/language/id/admin/settings/advanced.json | 3 ++- public/language/id/admin/settings/pagination.json | 3 +-- public/language/id/error.json | 1 + public/language/id/global.json | 1 + public/language/it/admin/advanced/database.json | 8 ++++++-- public/language/it/admin/manage/categories.json | 1 + public/language/it/admin/settings/advanced.json | 3 ++- public/language/it/admin/settings/pagination.json | 3 +-- public/language/it/error.json | 1 + public/language/it/global.json | 1 + public/language/ja/admin/advanced/database.json | 8 ++++++-- public/language/ja/admin/manage/categories.json | 1 + public/language/ja/admin/settings/advanced.json | 3 ++- public/language/ja/admin/settings/pagination.json | 3 +-- public/language/ja/error.json | 1 + public/language/ja/global.json | 1 + public/language/ko/admin/advanced/database.json | 8 ++++++-- public/language/ko/admin/manage/categories.json | 1 + public/language/ko/admin/settings/advanced.json | 3 ++- public/language/ko/admin/settings/pagination.json | 3 +-- public/language/ko/error.json | 1 + public/language/ko/global.json | 1 + public/language/lt/admin/advanced/database.json | 8 ++++++-- public/language/lt/admin/manage/categories.json | 1 + public/language/lt/admin/settings/advanced.json | 3 ++- public/language/lt/admin/settings/pagination.json | 3 +-- public/language/lt/error.json | 1 + public/language/lt/global.json | 1 + public/language/ms/admin/advanced/database.json | 8 ++++++-- public/language/ms/admin/manage/categories.json | 1 + public/language/ms/admin/settings/advanced.json | 3 ++- public/language/ms/admin/settings/pagination.json | 3 +-- public/language/ms/error.json | 1 + public/language/ms/global.json | 1 + public/language/nb/admin/advanced/database.json | 8 ++++++-- public/language/nb/admin/manage/categories.json | 1 + public/language/nb/admin/settings/advanced.json | 3 ++- public/language/nb/admin/settings/pagination.json | 3 +-- public/language/nb/error.json | 1 + public/language/nb/global.json | 1 + public/language/nl/admin/advanced/database.json | 8 ++++++-- public/language/nl/admin/manage/categories.json | 1 + public/language/nl/admin/settings/advanced.json | 3 ++- public/language/nl/admin/settings/pagination.json | 3 +-- public/language/nl/error.json | 1 + public/language/nl/global.json | 1 + public/language/pl/admin/advanced/database.json | 8 ++++++-- public/language/pl/admin/manage/categories.json | 1 + public/language/pl/admin/settings/advanced.json | 3 ++- public/language/pl/admin/settings/pagination.json | 3 +-- public/language/pl/error.json | 1 + public/language/pl/global.json | 1 + public/language/pt-BR/admin/advanced/database.json | 8 ++++++-- public/language/pt-BR/admin/manage/categories.json | 1 + public/language/pt-BR/admin/settings/advanced.json | 3 ++- public/language/pt-BR/admin/settings/pagination.json | 3 +-- public/language/pt-BR/error.json | 1 + public/language/pt-BR/global.json | 1 + public/language/pt-PT/admin/advanced/database.json | 8 ++++++-- public/language/pt-PT/admin/manage/categories.json | 1 + public/language/pt-PT/admin/settings/advanced.json | 3 ++- public/language/pt-PT/admin/settings/pagination.json | 3 +-- public/language/pt-PT/error.json | 1 + public/language/pt-PT/global.json | 1 + public/language/ro/admin/advanced/database.json | 8 ++++++-- public/language/ro/admin/manage/categories.json | 1 + public/language/ro/admin/settings/advanced.json | 3 ++- public/language/ro/admin/settings/pagination.json | 3 +-- public/language/ro/error.json | 1 + public/language/ro/global.json | 1 + public/language/ru/admin/advanced/database.json | 8 ++++++-- public/language/ru/admin/manage/categories.json | 1 + public/language/ru/admin/settings/advanced.json | 3 ++- public/language/ru/admin/settings/pagination.json | 3 +-- public/language/ru/error.json | 1 + public/language/ru/global.json | 1 + public/language/rw/admin/advanced/database.json | 8 ++++++-- public/language/rw/admin/manage/categories.json | 1 + public/language/rw/admin/settings/advanced.json | 3 ++- public/language/rw/admin/settings/pagination.json | 3 +-- public/language/rw/error.json | 1 + public/language/rw/global.json | 1 + public/language/sc/admin/advanced/database.json | 8 ++++++-- public/language/sc/admin/manage/categories.json | 1 + public/language/sc/admin/settings/advanced.json | 3 ++- public/language/sc/admin/settings/pagination.json | 3 +-- public/language/sc/error.json | 1 + public/language/sc/global.json | 1 + public/language/sk/admin/advanced/database.json | 8 ++++++-- public/language/sk/admin/manage/categories.json | 1 + public/language/sk/admin/settings/advanced.json | 3 ++- public/language/sk/admin/settings/pagination.json | 3 +-- public/language/sk/error.json | 1 + public/language/sk/global.json | 1 + public/language/sl/admin/advanced/database.json | 8 ++++++-- public/language/sl/admin/manage/categories.json | 1 + public/language/sl/admin/settings/advanced.json | 3 ++- public/language/sl/admin/settings/pagination.json | 3 +-- public/language/sl/error.json | 1 + public/language/sl/global.json | 1 + public/language/sr/admin/advanced/database.json | 8 ++++++-- public/language/sr/admin/manage/categories.json | 1 + public/language/sr/admin/settings/advanced.json | 3 ++- public/language/sr/admin/settings/pagination.json | 3 +-- public/language/sr/error.json | 1 + public/language/sr/global.json | 1 + public/language/sv/admin/advanced/database.json | 8 ++++++-- public/language/sv/admin/manage/categories.json | 1 + public/language/sv/admin/settings/advanced.json | 3 ++- public/language/sv/admin/settings/pagination.json | 3 +-- public/language/sv/error.json | 1 + public/language/sv/global.json | 1 + public/language/th/admin/advanced/database.json | 8 ++++++-- public/language/th/admin/manage/categories.json | 1 + public/language/th/admin/settings/advanced.json | 3 ++- public/language/th/admin/settings/pagination.json | 3 +-- public/language/th/error.json | 1 + public/language/th/global.json | 1 + public/language/tr/admin/advanced/database.json | 8 ++++++-- public/language/tr/admin/manage/categories.json | 1 + public/language/tr/admin/menu.json | 2 +- public/language/tr/admin/settings/advanced.json | 3 ++- public/language/tr/admin/settings/pagination.json | 3 +-- public/language/tr/error.json | 1 + public/language/tr/global.json | 1 + public/language/uk/admin/advanced/database.json | 8 ++++++-- public/language/uk/admin/manage/categories.json | 1 + public/language/uk/admin/settings/advanced.json | 3 ++- public/language/uk/admin/settings/pagination.json | 3 +-- public/language/uk/error.json | 1 + public/language/uk/global.json | 1 + public/language/vi/admin/advanced/database.json | 8 ++++++-- public/language/vi/admin/manage/categories.json | 1 + public/language/vi/admin/settings/advanced.json | 3 ++- public/language/vi/admin/settings/pagination.json | 3 +-- public/language/vi/error.json | 1 + public/language/vi/global.json | 1 + public/language/zh-CN/admin/advanced/database.json | 8 ++++++-- public/language/zh-CN/admin/manage/categories.json | 1 + public/language/zh-CN/admin/settings/advanced.json | 3 ++- public/language/zh-CN/admin/settings/pagination.json | 3 +-- public/language/zh-CN/error.json | 1 + public/language/zh-CN/global.json | 1 + public/language/zh-TW/admin/advanced/database.json | 8 ++++++-- public/language/zh-TW/admin/manage/categories.json | 1 + public/language/zh-TW/admin/settings/advanced.json | 3 ++- public/language/zh-TW/admin/settings/pagination.json | 3 +-- public/language/zh-TW/error.json | 1 + public/language/zh-TW/global.json | 1 + 259 files changed, 517 insertions(+), 216 deletions(-) diff --git a/public/language/ar/admin/advanced/database.json b/public/language/ar/admin/advanced/database.json index 8a8fc25a79..3386067a83 100644 --- a/public/language/ar/admin/advanced/database.json +++ b/public/language/ar/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index 1547469aa2..c57d4eecc8 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/ar/admin/settings/advanced.json b/public/language/ar/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/ar/admin/settings/advanced.json +++ b/public/language/ar/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ar/admin/settings/pagination.json b/public/language/ar/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/ar/admin/settings/pagination.json +++ b/public/language/ar/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 8000a23023..a214beaf35 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -78,6 +78,7 @@ "still-uploading": "الرجاء الانتظار حتى يكتمل الرفع.", "file-too-big": "الحد الأقصى لرفع الملفات %1 كيلو بت. رجاءًا ارفع ملف أصغر", "guest-upload-disabled": "خاصية رفع الملفات غير مفعلة للزوار.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 9fde8785f9..6b5c5aa992 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -85,6 +85,7 @@ "language": "اللغة", "guest": "زائر", "guests": "الزوار", + "former_user": "A Former User", "updated.title": "تم تحديث المنتدى", "updated.message": "لقد تم تحديث المنتدى إلى آخر نسخة للتو. إضغط هنا لإعادة تحميل الصفحة.", "privacy": "الخصوصية", diff --git a/public/language/bg/admin/advanced/database.json b/public/language/bg/admin/advanced/database.json index acc6fde389..07b450d974 100644 --- a/public/language/bg/admin/advanced/database.json +++ b/public/language/bg/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Едновременни операции в секунда", "redis.keyspace-hits": "Успешни търсения на ключове", "redis.keyspace-misses": "Неуспешни търсения на ключове", - "redis.raw-info": "Сурови данни от Redis" -} \ No newline at end of file + "redis.raw-info": "Сурови данни от Redis", + + "postgres": "Postgres", + "postgres.version": "Версия на PostgreSQL", + "postgres.raw-info": "Сурови данни от Postgres" +} diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 27780cdbcc..e1905f858e 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Няма)", "copy-settings": "Копиране на настройките от", "optional-clone-settings": "(Незадължително) Копиране на настройките от категория", + "clone-children": "Клониране на дъщерните категории и настройки", "purge": "Изтриване на категорията", "enable": "Включване", diff --git a/public/language/bg/admin/settings/advanced.json b/public/language/bg/admin/settings/advanced.json index de9700de8b..358298ec84 100644 --- a/public/language/bg/admin/settings/advanced.json +++ b/public/language/bg/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Методи за разрешаване на управлението на достъпа", "headers.acah": "Заглавки за разрешаване на управлението на достъпа", "hsts": "Стриктна транспортна сигурност", + "hsts.enabled": "Включване на HSTS (препоръчително)", "hsts.subdomains": "Включване на поддомейните в заглавката на HSTS", "hsts.preload": "Позволяване на предварителното зареждане на заглавката на HSTS", - "hsts.help": "За този уеб сайт вече има настроена заглавка за HSTS. Можете да изберете дали да включите поддомейните и дали за заредите предварително флаговете в заглавката си. Ако не знаете какво да направите, най-добре не избирайте нищо. Още информация ", + "hsts.help": "Ако това е включено, за този уеб ще бъде настроена заглавка за HSTS. Можете да изберете дали да включите поддомейните и дали за заредите предварително флаговете в заглавката си. Ако не знаете какво да направите, най-добре не избирайте нищо. Още информация", "traffic-management": "Управление на трафика", "traffic.help": "NodeBB има вграден модул, който автоматично отказва заявките в натоварените моменти. Можете да настроите поведението тук, въпреки че стойностите по подразбиране са добра отправна точка.", "traffic.enable": "Включване на управлението на трафика", diff --git a/public/language/bg/admin/settings/pagination.json b/public/language/bg/admin/settings/pagination.json index 06654639f6..8a89f189bc 100644 --- a/public/language/bg/admin/settings/pagination.json +++ b/public/language/bg/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Максимален брой публикации на страница", "categories": "Странициране на категориите", "topics-per-page": "Теми на страница", - "max-topics-per-page": "Максимален брой теми на страница", - "initial-num-load": "Начален брой теми, които да бъдат заредени за „непрочетени“, „скорошни“ и „популярни“" + "max-topics-per-page": "Максимален брой теми на страница" } \ No newline at end of file diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 370076d8e7..2aaa61e5ba 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -78,6 +78,7 @@ "still-uploading": "Моля, изчакайте качването да приключи.", "file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл", "guest-upload-disabled": "Качването не е разрешено за гости", + "cors-error": "Изображението не може да бъде качено поради неправилни настройки на CORS", "already-bookmarked": "Вече имате отметка към тази публикация", "already-unbookmarked": "Вече сте премахнали отметката си от тази публикация", "cant-ban-other-admins": "Не можете да блокирате другите администратори!", diff --git a/public/language/bg/global.json b/public/language/bg/global.json index 9c05d99ce9..1183739d06 100644 --- a/public/language/bg/global.json +++ b/public/language/bg/global.json @@ -85,6 +85,7 @@ "language": "Език", "guest": "Гост", "guests": "Гости", + "former_user": "Бивш потребител", "updated.title": "Форумът е актуализиран", "updated.message": "Този форум току-що беше актуализиран до най-новата версия. Натиснете тук, за да опресните страницата.", "privacy": "Поверителност", diff --git a/public/language/bn/admin/advanced/database.json b/public/language/bn/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/bn/admin/advanced/database.json +++ b/public/language/bn/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/bn/admin/settings/advanced.json b/public/language/bn/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/bn/admin/settings/advanced.json +++ b/public/language/bn/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/bn/admin/settings/pagination.json b/public/language/bn/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/bn/admin/settings/pagination.json +++ b/public/language/bn/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 686c827147..d6db79988f 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -78,6 +78,7 @@ "still-uploading": "আপলোড সম্পূর্ণ জন্য অনুগ্রহ করে অপেক্ষা করুন", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!", diff --git a/public/language/bn/global.json b/public/language/bn/global.json index 252e87f386..dc56a364c5 100644 --- a/public/language/bn/global.json +++ b/public/language/bn/global.json @@ -85,6 +85,7 @@ "language": "ভাষা", "guest": "অতিথি", "guests": "অতিথি", + "former_user": "A Former User", "updated.title": "ফোরাম আপডেট করা হয়েছে", "updated.message": "এই ফোরামে এইমাত্র সর্বশেষ সংস্করণে আপডেট করা হয়েছে। পৃষ্ঠাটি রিফ্রেশ করতে এখানে ক্লিক করুন।", "privacy": "নিরাপত্তা", diff --git a/public/language/cs/admin/advanced/database.json b/public/language/cs/admin/advanced/database.json index eb1bf4030c..380f8e2d0e 100644 --- a/public/language/cs/admin/advanced/database.json +++ b/public/language/cs/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Okamžité zpracování za sekundu", "redis.keyspace-hits": "Zpracováno klíčů", "redis.keyspace-misses": "Chyby klíče", - "redis.raw-info": "Informace Redis Raw" -} \ No newline at end of file + "redis.raw-info": "Informace Redis Raw", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index 2195181cf9..317c003097 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(nic)", "copy-settings": "Kopírovat nastavení z", "optional-clone-settings": "Klonovat nastavení z kategorie (doporučeno)", + "clone-children": "Clone Children Categories And Settings", "purge": "Vyčistit kategorii", "enable": "Povolit", diff --git a/public/language/cs/admin/settings/advanced.json b/public/language/cs/admin/settings/advanced.json index 965f9a9ec9..8c3fecc48a 100644 --- a/public/language/cs/admin/settings/advanced.json +++ b/public/language/cs/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Zahrnout poddomény v hlavičce HSTS", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Správa provozu", "traffic.help": "NodeBB obsahuje modul, který automaticky zamítá požadavky při vysokém vytížení. Toto nastavení můžete zde upravit, ačkoliv výchozí hodnoty jsou zaručením úspěchu.", "traffic.enable": "Povolit správu provozu", diff --git a/public/language/cs/admin/settings/pagination.json b/public/language/cs/admin/settings/pagination.json index 34052b2a9c..08871bc7ec 100644 --- a/public/language/cs/admin/settings/pagination.json +++ b/public/language/cs/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximální množství příspěvků na stránku", "categories": "Stránkování kategorii", "topics-per-page": "Témat na stránku", - "max-topics-per-page": "Maximální množství témat na stránku", - "initial-num-load": "Počáteční počet témat pro načtení u nepřečtených, posledních a polulárních" + "max-topics-per-page": "Maximální množství témat na stránku" } \ No newline at end of file diff --git a/public/language/cs/error.json b/public/language/cs/error.json index fd96f229b7..e25a932925 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -78,6 +78,7 @@ "still-uploading": "Vyčkejte, než se vše kompletně nahraje.", "file-too-big": "Maximální povolená velikost je %1 kB – nahrajte menší soubor", "guest-upload-disabled": "Nahrávání od hostů nebylo povoleno", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Již jste tento příspěvek zazáložkoval", "already-unbookmarked": "Již jste u tohoto příspěvku odebral záložku", "cant-ban-other-admins": "Nemůžete zablokovat jiné správce.", diff --git a/public/language/cs/global.json b/public/language/cs/global.json index a4d1056573..83d8151a93 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -85,6 +85,7 @@ "language": "Jazyk", "guest": "Host", "guests": "Hosté", + "former_user": "A Former User", "updated.title": "Fórum bylo zaktualizováno", "updated.message": "Toto fórum bylo právě aktualizováno na poslední verzi. Klikněte zde a obnovte tuto stránku.", "privacy": "Soukromí", diff --git a/public/language/da/admin/advanced/database.json b/public/language/da/admin/advanced/database.json index 42ae5af00c..a0a4167e87 100644 --- a/public/language/da/admin/advanced/database.json +++ b/public/language/da/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Øjeblikkelige Ops. pr. sekund", "redis.keyspace-hits": "Mellemrums Tryk", "redis.keyspace-misses": "Mellemrums Misses", - "redis.raw-info": "Redis Rå Info" -} \ No newline at end of file + "redis.raw-info": "Redis Rå Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/da/admin/settings/advanced.json b/public/language/da/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/da/admin/settings/advanced.json +++ b/public/language/da/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/da/admin/settings/pagination.json b/public/language/da/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/da/admin/settings/pagination.json +++ b/public/language/da/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/da/error.json b/public/language/da/error.json index 8b62fb0f6c..5d759d1122 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -78,6 +78,7 @@ "still-uploading": "Venligst vent til overførslen er færdig", "file-too-big": "Maksimum filstørrelse er %1 kB - venligst overfør en mindre fil", "guest-upload-disabled": "Gæsteupload er deaktiveret", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan ikke udlukke andre administatrorer!", diff --git a/public/language/da/global.json b/public/language/da/global.json index ef7779dba7..7c6d0b388a 100644 --- a/public/language/da/global.json +++ b/public/language/da/global.json @@ -85,6 +85,7 @@ "language": "Sprog", "guest": "Gæst", "guests": "Gæster", + "former_user": "A Former User", "updated.title": "Forum opdateret", "updated.message": "Dette form er lige blevet opdateret til den seneste version. Klik her for at genindlæse siden.", "privacy": "Privatliv", diff --git a/public/language/de/admin/advanced/database.json b/public/language/de/admin/advanced/database.json index 7caa65a1bb..ce8618de1d 100644 --- a/public/language/de/admin/advanced/database.json +++ b/public/language/de/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Durchschnittliche Anzahl von Ein-/Ausgaben pro Sekunde", "redis.keyspace-hits": "Schlüsselraum Treffer", "redis.keyspace-misses": "Schlüsselraum Verfehlungen", - "redis.raw-info": "Redis Rohinfo" -} \ No newline at end of file + "redis.raw-info": "Redis Rohinfo", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 509e12dc56..b35734c978 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Keine)", "copy-settings": "Kopiere Einstellungen von", "optional-clone-settings": "(Optional) dubliziere Einstellungen von Kategorie", + "clone-children": "Clone Children Categories And Settings", "purge": "Kategorie löschen", "enable": "Aktivieren", diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index e34e319715..16bde73908 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Subdomains in HSTS Header einbinden", "hsts.preload": "Vorabladen von HSTS Header erlauben", - "hsts.help": "Ein HSTS Header ist bereits für diese Seite vorkonfiguriert. Du kannst subdomains und preloading flags zur inklusion in den Header auswählen. Im zweifel kannst du diese abgewählt lassen.Mehr erfahren", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB wird mit einem Modul geliefert, welches automatisch anfragen in High-Traffic Situationen blockiert. Du kannst diese Einstellungen hier ändern, auch wenn die Standardeinstellungen einen guten Anfang darstellen sollten", "traffic.enable": "Traffic Management aktivieren", diff --git a/public/language/de/admin/settings/pagination.json b/public/language/de/admin/settings/pagination.json index 69d4f4484d..5a764e6c4d 100644 --- a/public/language/de/admin/settings/pagination.json +++ b/public/language/de/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximale Anzahl von Beiträgen pro Seite", "categories": "Kategorie Seitennummerierung", "topics-per-page": "Themen pro Seite", - "max-topics-per-page": "Maximale Anzahl von Themen pro Seite", - "initial-num-load": "Ursprüngliche Anzahl an Themen, die bei ungelesen, aktuell und beliebt geladen werden sollen" + "max-topics-per-page": "Maximale Anzahl von Themen pro Seite" } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index 7ad7efd637..6afc07c1a6 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -78,6 +78,7 @@ "still-uploading": "Bitte warte bis der Vorgang abgeschlossen ist.", "file-too-big": "Die maximale Dateigröße ist %1 kB, bitte lade eine kleinere Datei hoch.", "guest-upload-disabled": "Uploads für Gäste wurden deaktiviert.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Du hast diesen Beitrag bereits als Lesezeichen gespeichert", "already-unbookmarked": "Du hast diesen Beitrag bereits aus deinen Lesezeichen entfernt", "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", diff --git a/public/language/de/global.json b/public/language/de/global.json index b4c6c71e83..dcd8207b01 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -85,6 +85,7 @@ "language": "Sprache", "guest": "Gast", "guests": "Gäste", + "former_user": "A Former User", "updated.title": "Forum aktualisiert", "updated.message": "Dieses Forum wurde gerade auf die neueste Version aktualisiert. Klicke hier, um die Seite neuzuladen.", "privacy": "Privatsphäre", diff --git a/public/language/el/admin/advanced/database.json b/public/language/el/admin/advanced/database.json index d4ba886f65..e6ac336f6c 100644 --- a/public/language/el/admin/advanced/database.json +++ b/public/language/el/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/el/admin/settings/advanced.json b/public/language/el/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/el/admin/settings/advanced.json +++ b/public/language/el/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/el/admin/settings/pagination.json b/public/language/el/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/el/admin/settings/pagination.json +++ b/public/language/el/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/el/error.json b/public/language/el/error.json index 10aa9ce05d..4ac396667b 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -78,6 +78,7 @@ "still-uploading": "Παρακαλώ περίμενε να τελειώσει το ανέβασμα των αρχείων.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Δεν μπορείς να αποκλείσεις άλλους διαχειριστές!", diff --git a/public/language/el/global.json b/public/language/el/global.json index ca95be0334..611f316ae5 100644 --- a/public/language/el/global.json +++ b/public/language/el/global.json @@ -85,6 +85,7 @@ "language": "Γλώσσα", "guest": "Επισκέπτης", "guests": "Επισκέπτες", + "former_user": "A Former User", "updated.title": "Το φόρουμ αναβαθμίστηκε", "updated.message": "Το φόρουμ μόλις αναβαθμίστηκε στην πιο πρόσφατη έκδοση. Κάνε κλικ εδώ για να ανανεώσεις την σελίδα.", "privacy": "Privacy", diff --git a/public/language/en-US/admin/advanced/database.json b/public/language/en-US/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/en-US/admin/advanced/database.json +++ b/public/language/en-US/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/en-US/admin/settings/advanced.json b/public/language/en-US/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/en-US/admin/settings/advanced.json +++ b/public/language/en-US/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/en-US/admin/settings/pagination.json b/public/language/en-US/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/en-US/admin/settings/pagination.json +++ b/public/language/en-US/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index d0980ccf18..ecad0e0364 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -78,6 +78,7 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", diff --git a/public/language/en-US/global.json b/public/language/en-US/global.json index 77e78eac45..91100a0633 100644 --- a/public/language/en-US/global.json +++ b/public/language/en-US/global.json @@ -85,6 +85,7 @@ "language": "Language", "guest": "Guest", "guests": "Guests", + "former_user": "A Former User", "updated.title": "Forum Updated", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", "privacy": "Privacy", diff --git a/public/language/en-x-pirate/admin/advanced/database.json b/public/language/en-x-pirate/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/en-x-pirate/admin/advanced/database.json +++ b/public/language/en-x-pirate/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/en-x-pirate/admin/settings/advanced.json b/public/language/en-x-pirate/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/en-x-pirate/admin/settings/advanced.json +++ b/public/language/en-x-pirate/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/en-x-pirate/admin/settings/pagination.json b/public/language/en-x-pirate/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/en-x-pirate/admin/settings/pagination.json +++ b/public/language/en-x-pirate/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index d0980ccf18..ecad0e0364 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -78,6 +78,7 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", diff --git a/public/language/en-x-pirate/global.json b/public/language/en-x-pirate/global.json index 8bcba80e2e..2e7292038e 100644 --- a/public/language/en-x-pirate/global.json +++ b/public/language/en-x-pirate/global.json @@ -85,6 +85,7 @@ "language": "Language", "guest": "Guest", "guests": "Guests", + "former_user": "A Former User", "updated.title": "Forum Updated", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", "privacy": "Privacy", diff --git a/public/language/es/admin/advanced/database.json b/public/language/es/admin/advanced/database.json index 16c72eb046..7cef76555b 100644 --- a/public/language/es/admin/advanced/database.json +++ b/public/language/es/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Operaciones Instantáneas por Segundo", "redis.keyspace-hits": "Pulsaciones de espaciado del teclado", "redis.keyspace-misses": "Fallos de espaciado del teclado", - "redis.raw-info": "Fila de Información de Redis" -} \ No newline at end of file + "redis.raw-info": "Fila de Información de Redis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index 2e04ee7fad..3d134f9251 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Ninguna)", "copy-settings": "Copiar Configuración Desde", "optional-clone-settings": "(Opcional) Clonar Configuración De Categoría", + "clone-children": "Clone Children Categories And Settings", "purge": "Purgar Categoría", "enable": "Activar", diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index 1bd0a7a830..273c042848 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Administración de Tráfico", "traffic.help": "NodeBB se despliega equipado con un módulo que deniega automáticamente requests de HTTP en situaciones de tráfico alto. Puedes ajustar esta configuración aquí, aunque los valores por defecto son un punto de partida aceptable.", "traffic.enable": "Habilitar Administración de Tráfico", diff --git a/public/language/es/admin/settings/pagination.json b/public/language/es/admin/settings/pagination.json index 497b250d33..08ccc7e16f 100644 --- a/public/language/es/admin/settings/pagination.json +++ b/public/language/es/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Mensajes máximos por página", "categories": "Paginación de Categorías", "topics-per-page": "Temas por Página", - "max-topics-per-page": "Máximo de temas por página", - "initial-num-load": "Número Inicial de Temas para cargar en No Leídos, Recientes, Populares" + "max-topics-per-page": "Máximo de temas por página" } \ No newline at end of file diff --git a/public/language/es/error.json b/public/language/es/error.json index 731304fd13..e0a97d065d 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -78,6 +78,7 @@ "still-uploading": "Por favor, espera a que terminen las subidas.", "file-too-big": "El tamaño de fichero máximo es de %1 kB - por favor, suba un fichero más pequeño", "guest-upload-disabled": "Las subidas están deshabilitadas para los invitados", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Ya marcaste este mensaje", "already-unbookmarked": "Ya desmarcarste este mensaje", "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", diff --git a/public/language/es/global.json b/public/language/es/global.json index 75c731dd72..3f6dd1e014 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -85,6 +85,7 @@ "language": "Idioma", "guest": "Invitado", "guests": "Invitados", + "former_user": "A Former User", "updated.title": "Foro actualizado", "updated.message": "El foro acaba de ser actualizado a la última versión. Haz click aquí para refrescar la página.", "privacy": "Privacidad", diff --git a/public/language/et/admin/advanced/database.json b/public/language/et/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/et/admin/advanced/database.json +++ b/public/language/et/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/et/admin/settings/advanced.json b/public/language/et/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/et/admin/settings/advanced.json +++ b/public/language/et/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/et/admin/settings/pagination.json b/public/language/et/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/et/admin/settings/pagination.json +++ b/public/language/et/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/et/error.json b/public/language/et/error.json index d7dc1898a2..e01d803611 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -78,6 +78,7 @@ "still-uploading": "Palun oota, kuni üleslaadimised on laetud.", "file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kB - valige väiksema mahuga fail.", "guest-upload-disabled": "Külaliste üleslaadimine on keelatud.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!", diff --git a/public/language/et/global.json b/public/language/et/global.json index 76668a3d62..eab3d64a7d 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -85,6 +85,7 @@ "language": "Keel", "guest": "Külaline", "guests": "Külalised", + "former_user": "A Former User", "updated.title": "Foorum on uuendatud", "updated.message": "See foorum uuendati just kõige uuemale versioonile. Vajuta siia et värskendada veebilehte.", "privacy": "Privaatsus", diff --git a/public/language/fa-IR/admin/advanced/database.json b/public/language/fa-IR/admin/advanced/database.json index a2879dfe45..85b26214a2 100644 --- a/public/language/fa-IR/admin/advanced/database.json +++ b/public/language/fa-IR/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 302dcca66e..3f5d6701a0 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/fa-IR/admin/settings/advanced.json b/public/language/fa-IR/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/fa-IR/admin/settings/advanced.json +++ b/public/language/fa-IR/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/fa-IR/admin/settings/pagination.json b/public/language/fa-IR/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/fa-IR/admin/settings/pagination.json +++ b/public/language/fa-IR/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 26d343013e..08ac0efb50 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -78,6 +78,7 @@ "still-uploading": "خواهشمندیم تا پایان بارگذاری‌ها شکیبا باشید.", "file-too-big": "حداکثر مجاز حجم فایل %1 کیلوبایت می باشد - لطفا فایلی با حجم کمتر بارگذاری کنید", "guest-upload-disabled": "بارگذاری برای مهمانان غیر فعال شده است", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "شما قبلا این پست را نشانک کرده‌اید", "already-unbookmarked": "شما قبلا این پست را از نشانک در آوردید", "cant-ban-other-admins": "شما نمی‌توانید دیگر مدیران را محروم کنید!", diff --git a/public/language/fa-IR/global.json b/public/language/fa-IR/global.json index f78c02f324..f3099ce2e4 100644 --- a/public/language/fa-IR/global.json +++ b/public/language/fa-IR/global.json @@ -85,6 +85,7 @@ "language": "زبان", "guest": "مهمان", "guests": "مهمان‌ها", + "former_user": "A Former User", "updated.title": "انجمن بروزرسانی شد", "updated.message": "این انجمن به آخرین نسخه بروزرسانی شد. برای بارگذاری مجدد صفحه اینجا کلیک کنید.", "privacy": "حریم خصوصی", diff --git a/public/language/fi/admin/advanced/database.json b/public/language/fi/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/fi/admin/advanced/database.json +++ b/public/language/fi/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/fi/admin/settings/advanced.json b/public/language/fi/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/fi/admin/settings/advanced.json +++ b/public/language/fi/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/fi/admin/settings/pagination.json b/public/language/fi/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/fi/admin/settings/pagination.json +++ b/public/language/fi/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 7531825a6b..ffe19d2d61 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -78,6 +78,7 @@ "still-uploading": "Ole hyvä ja odota tiedostojen lähettämisen valmistumista.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Et voi estää muita ylläpitäjiä!", diff --git a/public/language/fi/global.json b/public/language/fi/global.json index 8e4371de76..daceb5d09e 100644 --- a/public/language/fi/global.json +++ b/public/language/fi/global.json @@ -85,6 +85,7 @@ "language": "Kieli", "guest": "Vieras", "guests": "Vieraat", + "former_user": "A Former User", "updated.title": "Foorumi päivitetty", "updated.message": "Tämä foorumi on juuri päivitetty uusimpaan versioon. Paina tästä päivittääksesi sivun.", "privacy": "Yksityisyys", diff --git a/public/language/fr/admin/advanced/database.json b/public/language/fr/admin/advanced/database.json index 46742ca044..d37b48dbc7 100644 --- a/public/language/fr/admin/advanced/database.json +++ b/public/language/fr/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Opérations instantanées par seconde", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Informations brutes Redis" -} \ No newline at end of file + "redis.raw-info": "Informations brutes Redis", + + "postgres": "Postgres", + "postgres.version": "Version PostgreSQL", + "postgres.raw-info": "Info brute Postgres" +} diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 3be2a24108..d8d201d31f 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Aucun)", "copy-settings": "Copier les paramètres de", "optional-clone-settings": "Copier les paramètres de la catégorie (optionnel)", + "clone-children": "Copier les catégories et les paramètres", "purge": "Vider la catégorie", "enable": "Activer", diff --git a/public/language/fr/admin/settings/advanced.json b/public/language/fr/admin/settings/advanced.json index 59428e93e4..c927981568 100644 --- a/public/language/fr/admin/settings/advanced.json +++ b/public/language/fr/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "\nAccess-Control-Allow-Methods", "headers.acah": "\nAccess-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Activer HSTS (recommandé)", "hsts.subdomains": "Inclure les sous-domaines dans l'en-tête HSTS", "hsts.preload": "Autoriser le préchargement de l'en-tête HSTS", - "hsts.help": "Un en-tête HSTS est déjà pré-configuré pour ce site. Vous pouvez choisir d'inclure des sous-domaines et des indicateurs de préchargement dans votre en-tête. En cas de doute, vous pouvez les laisser non cochés. Plus d'informations", + "hsts.help": "Si activé, un en-tête HSTS sera défini pour ce site. Vous pouvez choisir d'inclure des sous-domaines et des indicateurs de préchargement dans votre en-tête. En cas de doute, ne cochez pas l'option. Plus d'informations", "traffic-management": "Gestion du trafic", "traffic.help": "NodeBB est déployé équipé d'un module qui refuse les requêtes en cas de situation de haut traffic. Vous pouvez changer les paramètres ici, bien que les paramètres par défaut sont un bon commencement.", "traffic.enable": "Activé la gestion du trafic", diff --git a/public/language/fr/admin/settings/pagination.json b/public/language/fr/admin/settings/pagination.json index e675776234..9e2ee932c1 100644 --- a/public/language/fr/admin/settings/pagination.json +++ b/public/language/fr/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Messages maximum par page", "categories": "Pagination des categories", "topics-per-page": "Sujets par page", - "max-topics-per-page": "Sujets maximum par page", - "initial-num-load": "Nombre initial de sujets à charger dans Non lus, Récents et Populaires" + "max-topics-per-page": "Sujets maximum par page" } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 3de4cbafe2..79000854f2 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -78,6 +78,7 @@ "still-uploading": "Veuillez patienter pendant l'envoi des fichiers.", "file-too-big": "La taille maximale autorisée pour un fichier est de %1 ko. Veuillez envoyer un fichier plus petit.", "guest-upload-disabled": "L'envoi de fichiers a été désactivé pour les invités", + "cors-error": "Impossible d'envoyer l'image en raison d'une erreur de configuration CORS", "already-bookmarked": "Vous avez déjà mis un marque-page", "already-unbookmarked": "Vous avez déjà retiré un marque-page", "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs !", diff --git a/public/language/fr/global.json b/public/language/fr/global.json index dd584772b6..b4959e13ba 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -85,6 +85,7 @@ "language": "Langue", "guest": "Invité", "guests": "Invités", + "former_user": "Un Ancien Utilisateur", "updated.title": "Forum mis à jour", "updated.message": "Ce forum a été mis à jour à la dernière version. Cliquez ici pour recharger la page.", "privacy": "Vie privée", diff --git a/public/language/gl/admin/advanced/database.json b/public/language/gl/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/gl/admin/advanced/database.json +++ b/public/language/gl/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/gl/admin/settings/advanced.json b/public/language/gl/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/gl/admin/settings/advanced.json +++ b/public/language/gl/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/gl/admin/settings/pagination.json b/public/language/gl/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/gl/admin/settings/pagination.json +++ b/public/language/gl/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 52853bdf69..efec6e0e41 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -78,6 +78,7 @@ "still-uploading": "Por favor, agarda a que remate a subida.", "file-too-big": "O tamaño máximo permitido é %1 kB - por favor, sube un arquivo máis pequeno", "guest-upload-disabled": "As subidas están deshabilitadas para os convidados", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Xa marcaches esta mensaxe", "already-unbookmarked": "Xa desmarcaches esta mensaxe", "cant-ban-other-admins": "Non podes botar outros administradores!", diff --git a/public/language/gl/global.json b/public/language/gl/global.json index 344475d12b..ea339d0f27 100644 --- a/public/language/gl/global.json +++ b/public/language/gl/global.json @@ -85,6 +85,7 @@ "language": "Idioma", "guest": "Invitado", "guests": "Invitados", + "former_user": "A Former User", "updated.title": "Foro Actualizado", "updated.message": "O foro acaba de ser actualizado á última versión. Pica aquí para actualizar a páxina.", "privacy": "Privacidad", diff --git a/public/language/he/admin/advanced/database.json b/public/language/he/admin/advanced/database.json index 142c70e080..f3fd3d7866 100644 --- a/public/language/he/admin/advanced/database.json +++ b/public/language/he/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "מידע לא מעובד מRedis" -} \ No newline at end of file + "redis.raw-info": "מידע לא מעובד מRedis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/he/admin/settings/advanced.json b/public/language/he/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/he/admin/settings/advanced.json +++ b/public/language/he/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/he/admin/settings/pagination.json b/public/language/he/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/he/admin/settings/pagination.json +++ b/public/language/he/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/he/error.json b/public/language/he/error.json index 8e93e70ccd..f105c10261 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -78,6 +78,7 @@ "still-uploading": "אנא המתן לסיום ההעלאות", "file-too-big": "הגודל המקסימלי של הקובץ הוא %1 קילובייט - אנא העלה קובץ קטן יותר", "guest-upload-disabled": "העלאת אורחים אינה מאופשרת", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "כבר הוספת פוסט זה לרשימת המסומנים", "already-unbookmarked": "כבר הסרת פוסט זה מרשימת המסומנים", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", diff --git a/public/language/he/global.json b/public/language/he/global.json index 01db853e25..e6dc05db67 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -85,6 +85,7 @@ "language": "שפה", "guest": "אורח", "guests": "אורחים", + "former_user": "A Former User", "updated.title": "הפורום עודכן", "updated.message": "הפורום עודכן לגרסא האחרונה. נא ללחוץ כאן לעדכון הדף.", "privacy": "פרטיות", diff --git a/public/language/hr/admin/advanced/database.json b/public/language/hr/admin/advanced/database.json index e79a4b6192..1936b2d04c 100644 --- a/public/language/hr/admin/advanced/database.json +++ b/public/language/hr/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instante operacije po sekundi", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis sirova informacija" -} \ No newline at end of file + "redis.raw-info": "Redis sirova informacija", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index 499ef11ba3..7c05ea8057 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Ništa)", "copy-settings": "Kopiraj postavke iz ", "optional-clone-settings": "(Opcionalno) Kloniraj postavke iz kategorije", + "clone-children": "Clone Children Categories And Settings", "purge": "Odbaci kategoriju", "enable": "Omogući", diff --git a/public/language/hr/admin/settings/advanced.json b/public/language/hr/admin/settings/advanced.json index a44ae02df8..04890b57dd 100644 --- a/public/language/hr/admin/settings/advanced.json +++ b/public/language/hr/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Upravljanje prometom", "traffic.help": "NodeBB koristi modul koji automatski odbija zahtjeve u situacijama visokog prometa.Možete ove postavke izmjeniti ovdje,iako su već zadane postavke dobra početna točka.", "traffic.enable": "Omogući upravljanje prometom", diff --git a/public/language/hr/admin/settings/pagination.json b/public/language/hr/admin/settings/pagination.json index c92407cbf5..4b09a7b67e 100644 --- a/public/language/hr/admin/settings/pagination.json +++ b/public/language/hr/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Numeriranje kategorija", "topics-per-page": "Tema po stranici", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Početni broj tema za učitati u sekcijama nepročitano,nedavno i popularno." + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/hr/error.json b/public/language/hr/error.json index 224ad276b0..3b734d72dd 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -78,6 +78,7 @@ "still-uploading": "Pričekajte da se prijenos završi.", "file-too-big": "Maksimalna veličina datoteke je %1 kB - učitajte manju datoteku", "guest-upload-disabled": "Učitavanje datoteka za goste je isključeno", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Već ste zabilježili ovu objavu", "already-unbookmarked": "Već ste odbilježili ovu objavu", "cant-ban-other-admins": "Nemožete blokirati ostale administratore!", diff --git a/public/language/hr/global.json b/public/language/hr/global.json index 8e62cb8e8d..596309e585 100644 --- a/public/language/hr/global.json +++ b/public/language/hr/global.json @@ -85,6 +85,7 @@ "language": "Jezik", "guest": "Gost", "guests": "Gosti", + "former_user": "A Former User", "updated.title": "Forum je nadograđen", "updated.message": "Ovaj forum je upravo nadograđen na posljednju verziju. Klikni ovdje za ponovno učitavanje stranice.", "privacy": "Privatnost", diff --git a/public/language/hu/admin/advanced/database.json b/public/language/hu/admin/advanced/database.json index 56ecf05dfd..96161dee05 100644 --- a/public/language/hu/admin/advanced/database.json +++ b/public/language/hu/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Pillanatnyi művelet mpercenként", "redis.keyspace-hits": "Kulcstér találatok", "redis.keyspace-misses": "Kulcstér tévesztések", - "redis.raw-info": "Redis nyers információ" -} \ No newline at end of file + "redis.raw-info": "Redis nyers információ", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index bca68898de..0edeee2d23 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Nincs)", "copy-settings": "Beállítások másolása", "optional-clone-settings": "(Nem kötelező) Beállítások klónozása az alábbi kategóriából", + "clone-children": "Clone Children Categories And Settings", "purge": "Kategória kitörlése", "enable": "Engedélyezés", diff --git a/public/language/hu/admin/settings/advanced.json b/public/language/hu/admin/settings/advanced.json index 8050738c01..84b84ab3ed 100644 --- a/public/language/hu/admin/settings/advanced.json +++ b/public/language/hu/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Forgalomirányítás", "traffic.help": "A NodeBB egy, a kéréseket nagy forgalmú helyzetekben automatikusan elutasító modullal felszerelve vonul fel. Átállíthatod ezen opciókat, habár az alapértékek egy remek kiinduló pont.", "traffic.enable": "Forgalomirányítás engedélyezése", diff --git a/public/language/hu/admin/settings/pagination.json b/public/language/hu/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/hu/admin/settings/pagination.json +++ b/public/language/hu/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 21f34a819a..1bf90ab3ae 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -78,6 +78,7 @@ "still-uploading": "Kérlek várj, amíg a feltöltés befejeződik.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Nem tilthatsz ki másik adminisztrátort!", diff --git a/public/language/hu/global.json b/public/language/hu/global.json index f859ae73b4..595ce4752a 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -85,6 +85,7 @@ "language": "Nyelv", "guest": "Vendég", "guests": "Vendég", + "former_user": "A Former User", "updated.title": "Fórum frissítve", "updated.message": "A fórum frissítve lett a legutolsó verzióra. Kattints ide az oldal újratöltéséhez.", "privacy": "Titoktartás", diff --git a/public/language/id/admin/advanced/database.json b/public/language/id/admin/advanced/database.json index 567d4ac269..fe2720e989 100644 --- a/public/language/id/admin/advanced/database.json +++ b/public/language/id/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/id/admin/settings/advanced.json b/public/language/id/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/id/admin/settings/advanced.json +++ b/public/language/id/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/id/admin/settings/pagination.json b/public/language/id/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/id/admin/settings/pagination.json +++ b/public/language/id/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/id/error.json b/public/language/id/error.json index f76d344c43..2923dd548d 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -78,6 +78,7 @@ "still-uploading": "Tunggu proses upload sampai selesai", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Kamu tidak dapat ban admin lainnya!", diff --git a/public/language/id/global.json b/public/language/id/global.json index 1bc50bd977..371adf820b 100644 --- a/public/language/id/global.json +++ b/public/language/id/global.json @@ -85,6 +85,7 @@ "language": "Bahasa", "guest": "Tamu", "guests": "Tamu", + "former_user": "A Former User", "updated.title": "Forum telah diupdate", "updated.message": "Forum ini telah diupdate ke versi terbaru. Klik disini untuk memuat halaman.", "privacy": "Privasi", diff --git a/public/language/it/admin/advanced/database.json b/public/language/it/admin/advanced/database.json index 7430868748..c4a2e0bee8 100644 --- a/public/language/it/admin/advanced/database.json +++ b/public/language/it/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Operazioni Instantanee al Secondo", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/it/admin/settings/advanced.json b/public/language/it/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/it/admin/settings/advanced.json +++ b/public/language/it/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/it/admin/settings/pagination.json b/public/language/it/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/it/admin/settings/pagination.json +++ b/public/language/it/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/it/error.json b/public/language/it/error.json index e0e280fee1..9ffa430834 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -78,6 +78,7 @@ "still-uploading": "Per favore attendere il completamento degli uploads.", "file-too-big": "La dimensione massima consentita è di %1 kB - si prega di caricare un file più piccolo", "guest-upload-disabled": "Il caricamento da ospite è stato disattivato", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Hai già aggiunto questa discussione ai preferiti.", "already-unbookmarked": "Hai già rimosso questa discussione dai preferiti", "cant-ban-other-admins": "Non puoi bannare altri amministratori!", diff --git a/public/language/it/global.json b/public/language/it/global.json index fabbb2b9fb..1c48f0ac2d 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -85,6 +85,7 @@ "language": "Lingua", "guest": "Ospite", "guests": "Ospiti", + "former_user": "A Former User", "updated.title": "Forum Aggiornato", "updated.message": "Questo forum è stato aggiornato all'ultima versione. Clicca qui per ricaricare la pagina.", "privacy": "Privacy", diff --git a/public/language/ja/admin/advanced/database.json b/public/language/ja/admin/advanced/database.json index 5b9b0977f0..a02f6bc4c1 100644 --- a/public/language/ja/admin/advanced/database.json +++ b/public/language/ja/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "秒ごとの瞬間操作数", "redis.keyspace-hits": "ヒットしたキー・スペース", "redis.keyspace-misses": "見逃したキー・スペース", - "redis.raw-info": "RedisのRaw情報" -} \ No newline at end of file + "redis.raw-info": "RedisのRaw情報", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 0933cfd4ba..a0414c79cb 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(なし)", "copy-settings": "設定をコピー", "optional-clone-settings": "カテゴリからのクローン設定(任意)", + "clone-children": "Clone Children Categories And Settings", "purge": "カテゴリを切り離す", "enable": "有効", diff --git a/public/language/ja/admin/settings/advanced.json b/public/language/ja/admin/settings/advanced.json index 2d4da1813b..c1624672c7 100644 --- a/public/language/ja/admin/settings/advanced.json +++ b/public/language/ja/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "アクセス-制御-有効-メソッド", "headers.acah": "アクセス-制御-有効-ヘッダー", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "トラフィック管理", "traffic.help": "NodeBBは、トラフィックの多い状況で要求を自動的に拒否するモジュールを備えています。これらの設定はここで調整することができますが、はじめはデフォルト設定にしておくことをお勧めします。", "traffic.enable": "トラフィック管理を有効にする", diff --git a/public/language/ja/admin/settings/pagination.json b/public/language/ja/admin/settings/pagination.json index dc33c07c6c..c92725b985 100644 --- a/public/language/ja/admin/settings/pagination.json +++ b/public/language/ja/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "カテゴリページ", "topics-per-page": "ページごとのスレッド数", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "未読、最近、および人気に読み込むスレッドの初期数" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/ja/error.json b/public/language/ja/error.json index abd981e9f3..145a33b64d 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -78,6 +78,7 @@ "still-uploading": "アップロードが完成するまでお待ちください。", "file-too-big": "%1kBより大きいサイズファイルが許されません-より小さいファイルをアップして下さい。", "guest-upload-disabled": "ゲストさんからのアップを無効にしています", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "あなたは、この投稿をすでにブックマークしています", "already-unbookmarked": "あなたは、この投稿をすでにブックマークから外しています", "cant-ban-other-admins": "ほかの管理者を停止することはできません!", diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 63a57e2bb2..116bfcf9db 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -85,6 +85,7 @@ "language": "言語", "guest": "ゲスト", "guests": "ゲスト", + "former_user": "A Former User", "updated.title": "Forum Updated", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", "privacy": "プライバシー設定", diff --git a/public/language/ko/admin/advanced/database.json b/public/language/ko/admin/advanced/database.json index ee38140153..56ad994c1f 100644 --- a/public/language/ko/admin/advanced/database.json +++ b/public/language/ko/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "초당 Instantaneous Ops", "redis.keyspace-hits": "Keyspace 히트", "redis.keyspace-misses": "Keyspace 미스", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 015d9ddbb1..00bc8d7e55 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(없음)", "copy-settings": "에서 설정 복사", "optional-clone-settings": "(선택) 게시판에서 설정 복사", + "clone-children": "Clone Children Categories And Settings", "purge": "게시판 삭제", "enable": "활성화", diff --git a/public/language/ko/admin/settings/advanced.json b/public/language/ko/admin/settings/advanced.json index fd25778e4a..5896bb26e6 100644 --- a/public/language/ko/admin/settings/advanced.json +++ b/public/language/ko/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "트래픽 관리", "traffic.help": "NodeBB는 트래픽이 많은 상황에서는 자동으로 리퀘스트를 거부하는 모듈을 가지고 있습니다. 이에 관련된 세팅은 디폴트 값들도 괜찮지만, 여기서 세부 조율도 가능합니다.", "traffic.enable": "트래픽 관리 허용", diff --git a/public/language/ko/admin/settings/pagination.json b/public/language/ko/admin/settings/pagination.json index ebcc672f9a..8fc68241b4 100644 --- a/public/language/ko/admin/settings/pagination.json +++ b/public/language/ko/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "페이지당 최대 포스트수", "categories": "카테고리 페이지", "topics-per-page": "페이지 당 주제 수", - "max-topics-per-page": "페이지당 최대 게시물 수", - "initial-num-load": "읽지 않은 글, 최근 작성 글, 인기 글 게시판에서 처음 보여줄 게시글 개수" + "max-topics-per-page": "페이지당 최대 게시물 수" } \ No newline at end of file diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 6ee5d5e815..a6e6f3ecfe 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -78,6 +78,7 @@ "still-uploading": "업로드가 끝날 때까지 기다려주세요.", "file-too-big": "업로드 가능한 파일크기는 최대 %1 KB 입니다 - 파일의 용량을 줄이거나 압축을 활용하세요.", "guest-upload-disabled": "미가입 사용자의 파일 업로드는 제한되어 있습니다.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "이미 즐겨찾기에 추가한 포스트 입니다.", "already-unbookmarked": "이미 즐겨찾기를 해제한 포스트 입니다.", "cant-ban-other-admins": "다른 관리자를 차단할 수 없습니다.", diff --git a/public/language/ko/global.json b/public/language/ko/global.json index 715a6dfba9..ede3367a3b 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -85,6 +85,7 @@ "language": "언어", "guest": "익명 사용자", "guests": "익명 사용자", + "former_user": "A Former User", "updated.title": "포럼이 업데이트 되었습니다.", "updated.message": "이 포럼은 지금 최신 버전으로 업데이트 되었습니다. 페이지를 새로고침 하시려면 여기를 클릭해주세요.", "privacy": "개인정보", diff --git a/public/language/lt/admin/advanced/database.json b/public/language/lt/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/lt/admin/advanced/database.json +++ b/public/language/lt/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/lt/admin/settings/advanced.json b/public/language/lt/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/lt/admin/settings/advanced.json +++ b/public/language/lt/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/lt/admin/settings/pagination.json b/public/language/lt/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/lt/admin/settings/pagination.json +++ b/public/language/lt/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 1b321a1f6b..b1efa060bf 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -78,6 +78,7 @@ "still-uploading": "Prašome palaukti kol bus baigti visi kėlimai į serverį", "file-too-big": "Didžiausias įkelimo dydis yra %1 kB - prašome kelti mažesni failą", "guest-upload-disabled": "Failų įkėlimas svečiams išjungtas", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Jūs jau turite žymekelį šiam įrašui", "already-unbookmarked": "Jūs jau nuėmėte žymeklį šiam įrašui", "cant-ban-other-admins": "Jūs negalite užblokuoti kitų administratorių!", diff --git a/public/language/lt/global.json b/public/language/lt/global.json index 37e9817f4b..be51e632fe 100644 --- a/public/language/lt/global.json +++ b/public/language/lt/global.json @@ -85,6 +85,7 @@ "language": "Kalba", "guest": "Svečias", "guests": "Svečiai", + "former_user": "A Former User", "updated.title": "Forumas atnaujintas", "updated.message": "Forumas buvo atnaujintas iki naujausios versijos. Paspauskite čia norėdami perkrauti puslapį.", "privacy": "Privatumas", diff --git a/public/language/ms/admin/advanced/database.json b/public/language/ms/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/ms/admin/advanced/database.json +++ b/public/language/ms/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/ms/admin/settings/advanced.json b/public/language/ms/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/ms/admin/settings/advanced.json +++ b/public/language/ms/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ms/admin/settings/pagination.json b/public/language/ms/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/ms/admin/settings/pagination.json +++ b/public/language/ms/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 2d79e9a046..24e15eee1b 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -78,6 +78,7 @@ "still-uploading": "Sila tunggu muatnaik untuk siap.", "file-too-big": "Maksimum saiz fail yang dibenarkan ialah %1 kB - sila muatnaik fail yang lebih kecil", "guest-upload-disabled": "Tetamu tidak dibenarkan memuatnaik fail", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Anda tidak boleh haramkan admin / pentadbir!", diff --git a/public/language/ms/global.json b/public/language/ms/global.json index f81cedc744..1187a3747c 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -85,6 +85,7 @@ "language": "Bahasa", "guest": "Pelawat", "guests": "Pelawat", + "former_user": "A Former User", "updated.title": "Forum Dikemaskini", "updated.message": "Forum ini baru sahaja dikemaskini ke versi terkini. Klik sini untuk segar semula halaman.", "privacy": "Privasi", diff --git a/public/language/nb/admin/advanced/database.json b/public/language/nb/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/nb/admin/advanced/database.json +++ b/public/language/nb/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/nb/admin/settings/advanced.json b/public/language/nb/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/nb/admin/settings/advanced.json +++ b/public/language/nb/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/nb/admin/settings/pagination.json b/public/language/nb/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/nb/admin/settings/pagination.json +++ b/public/language/nb/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 644506cc3f..e176c363cc 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -78,6 +78,7 @@ "still-uploading": "Vennligst vent til opplastingene er fullført.", "file-too-big": "Største tillatte filstørrelse er %1 kB – vennligst last opp en mindre fil", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan ikke utestenge andre administratorer!", diff --git a/public/language/nb/global.json b/public/language/nb/global.json index 4c52bc32d0..f0fae9227d 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -85,6 +85,7 @@ "language": "Språk", "guest": "Gjest", "guests": "Gjester", + "former_user": "A Former User", "updated.title": "Forum oppdatert", "updated.message": "Dette forumet har nettopp blitt oppdatert til den nyeste versjonen. Klikk her for å laste siden på nytt.", "privacy": "Personvern", diff --git a/public/language/nl/admin/advanced/database.json b/public/language/nl/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/nl/admin/advanced/database.json +++ b/public/language/nl/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/nl/admin/settings/advanced.json b/public/language/nl/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/nl/admin/settings/advanced.json +++ b/public/language/nl/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/nl/admin/settings/pagination.json b/public/language/nl/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/nl/admin/settings/pagination.json +++ b/public/language/nl/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 55ae8def4d..088ebb7f2f 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -78,6 +78,7 @@ "still-uploading": "Een moment geduld tot alle bestanden overgebracht zijn...", "file-too-big": "Maximum toegestane bestandsgrootte is %1 kB - probeer een kleiner bestand te verzenden", "guest-upload-disabled": "Uploads voor gasten zijn uitgeschaleld ", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Je hebt dit bericht al als favoriet toegevoegd", "already-unbookmarked": "Je hebt dit bericht al verwijderd uit je favorieten", "cant-ban-other-admins": "Het is niet toegestaan andere beheerders te verbannen!", diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 73d051b5a1..2807f561d9 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -85,6 +85,7 @@ "language": "Taal", "guest": "Gast", "guests": "Gasten", + "former_user": "A Former User", "updated.title": "Site update", "updated.message": "Deze site heeft zojuist een update ontvangen. Klik hier om de pagina te verversen.", "privacy": "Privé", diff --git a/public/language/pl/admin/advanced/database.json b/public/language/pl/admin/advanced/database.json index 7e443c5557..58a7b540fd 100644 --- a/public/language/pl/admin/advanced/database.json +++ b/public/language/pl/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Natychmiastowe Operacje Na Sekundę", "redis.keyspace-hits": "Trafione Klucze", "redis.keyspace-misses": "Nietrafione Klucze", - "redis.raw-info": "Informacje Redis" -} \ No newline at end of file + "redis.raw-info": "Informacje Redis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index b1e55e9f7e..8757fad402 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Żadna)", "copy-settings": "Skopiuj ustawienia z", "optional-clone-settings": "(Opcjonalnie) Skopiowanie ustawień z kategorii", + "clone-children": "Clone Children Categories And Settings", "purge": "Usuń kategorię", "enable": "Włącz", diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index f52f0fca8b..a0deb8ce17 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Kontrola-Dostępu-Zezwól-Metody", "headers.acah": "Kontrola-Dostępu-Zezwól-Nagłówki", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Uwzględnij subdomeny w nagłówku HSTS", "hsts.preload": "Zezwól na wstępne ładowanie nagłówka HSTS", - "hsts.help": "Nagłówek HSTS został już wstępnie skonfigurowany dla tej strony. Możesz zdecydować, czy uwzględnić subdomeny i wstępnie ładować flagi w nagłówku. Jeśli masz wątpliwości, możesz zostawić te pola niezaznaczone. Więcej informacji ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Zarządzanie ruchem", "traffic.help": "System NodeBB jest dostarczany z modułem, który automatycznie blokuje żądania w przypadku nadmiernego ruchu. Tutaj możesz zmienić te ustawienia, ale ustawienia początkowe są dobrym punktem wyjścia w większości sytuacji.", "traffic.enable": "Włącz zarządzanie ruchem", diff --git a/public/language/pl/admin/settings/pagination.json b/public/language/pl/admin/settings/pagination.json index 5924cc0156..be6359c62d 100644 --- a/public/language/pl/admin/settings/pagination.json +++ b/public/language/pl/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maksymalna liczba postów na stronie", "categories": "Paginacja kategorii", "topics-per-page": "Tematów na stronę", - "max-topics-per-page": "Maksymalna liczba tematów na stronie", - "initial-num-load": "Początkowa liczba tematów ładowanych w Nieprzeczytanych, Ostatnich i Popularnych" + "max-topics-per-page": "Maksymalna liczba tematów na stronie" } \ No newline at end of file diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 88d6d9fc93..138e96902c 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -78,6 +78,7 @@ "still-uploading": "Poczekaj na zakończenie przesyłania", "file-too-big": "Maksymalny dopuszczalny rozmiar pliku to %1 kB – prześlij mniejszy plik", "guest-upload-disabled": "Przesyłanie plików przez gości zostało wyłączone", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Już dodałeś ten post do zakładek", "already-unbookmarked": "Już usunąłeś ten post z zakładek", "cant-ban-other-admins": "Nie możesz zbanować innych adminów!", diff --git a/public/language/pl/global.json b/public/language/pl/global.json index e8f7549071..a4e829447a 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -85,6 +85,7 @@ "language": "Język", "guest": "Gość", "guests": "Goście", + "former_user": "A Former User", "updated.title": "Forum zaktualizowane", "updated.message": "To forum zostało zaktualizowane do najnowszej wersji. Kliknij tutaj, by odświeżyć stronę.", "privacy": "Prywatność", diff --git a/public/language/pt-BR/admin/advanced/database.json b/public/language/pt-BR/admin/advanced/database.json index a7299086b2..20205fa0d4 100644 --- a/public/language/pt-BR/admin/advanced/database.json +++ b/public/language/pt-BR/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Ops. Instantâneas Por Segundo", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Informação Raw do Redis" -} \ No newline at end of file + "redis.raw-info": "Informação Raw do Redis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 1e24ba2a87..2a2cbd7754 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Nenhum)", "copy-settings": "Copiar Configurações De", "optional-clone-settings": "(Opcional) Clonar Configurações De Categoria", + "clone-children": "Clone Children Categories And Settings", "purge": "Purgar Categoria", "enable": "Ativar", diff --git a/public/language/pt-BR/admin/settings/advanced.json b/public/language/pt-BR/admin/settings/advanced.json index 22f729fb63..4ae6f3af6a 100644 --- a/public/language/pt-BR/admin/settings/advanced.json +++ b/public/language/pt-BR/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Administração de Tráfego", "traffic.help": "O NodeBB é instalado equipado com um módulo que automaticamente nega solicitações em situações de alto tráfego. Você pode ajustar estas configurações aqui, apesar de que os padrões são um bom começo.", "traffic.enable": "Ligar a Administração de Tráfego", diff --git a/public/language/pt-BR/admin/settings/pagination.json b/public/language/pt-BR/admin/settings/pagination.json index 6ef49262d9..5a439ed519 100644 --- a/public/language/pt-BR/admin/settings/pagination.json +++ b/public/language/pt-BR/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Paginação de Categorias", "topics-per-page": "Tópicos por Página", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Número Inicial de Tópicos paa Carregar em Não-lidos, Recentes, e Populares" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index d8e87a3432..97a1599e0a 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -78,6 +78,7 @@ "still-uploading": "Aguarde a conclusão dos uploads.", "file-too-big": "O tamanho máximo permitido de arquivo é de %1 kB - por favor faça upload de um arquivo menor", "guest-upload-disabled": "O upload por visitantes foi desabilitado", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Você já adicionou este post aos favoritos", "already-unbookmarked": "Você já removeu este post dos favoritos", "cant-ban-other-admins": "Você não pode banir outros administradores!", diff --git a/public/language/pt-BR/global.json b/public/language/pt-BR/global.json index 3bc6250c91..987e11317f 100644 --- a/public/language/pt-BR/global.json +++ b/public/language/pt-BR/global.json @@ -85,6 +85,7 @@ "language": "Idioma", "guest": "Visitante", "guests": "Visitantes", + "former_user": "A Former User", "updated.title": "Fórum Atualizado", "updated.message": "Este fórum foi atualizado para sua última versão. Clique aqui para atualizar a página.", "privacy": "Privacidade", diff --git a/public/language/pt-PT/admin/advanced/database.json b/public/language/pt-PT/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/pt-PT/admin/advanced/database.json +++ b/public/language/pt-PT/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/pt-PT/admin/settings/advanced.json b/public/language/pt-PT/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/pt-PT/admin/settings/advanced.json +++ b/public/language/pt-PT/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/pt-PT/admin/settings/pagination.json b/public/language/pt-PT/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/pt-PT/admin/settings/pagination.json +++ b/public/language/pt-PT/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index cba099adda..e735eb41d4 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -78,6 +78,7 @@ "still-uploading": "Por favor aguarda até todos os uploads estarem completos.", "file-too-big": "O tamanho máximo permitido para um ficheiro é de %1 kB - por favor carrega um ficheiro mais pequeno", "guest-upload-disabled": "Upload por parte de convidados foi desativado", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Já marcaste esta publicação", "already-unbookmarked": "Já desmarcaste esta publicação", "cant-ban-other-admins": "Não podes banir outros administradores!", diff --git a/public/language/pt-PT/global.json b/public/language/pt-PT/global.json index 5ee650691f..08be36df69 100644 --- a/public/language/pt-PT/global.json +++ b/public/language/pt-PT/global.json @@ -85,6 +85,7 @@ "language": "Língua", "guest": "Convidado", "guests": "Convidados", + "former_user": "A Former User", "updated.title": "Forum atualizado", "updated.message": "Este forum acabou de ser atualizado para a última versão. Carrega aqui para atualizares a página.", "privacy": "Privacidade", diff --git a/public/language/ro/admin/advanced/database.json b/public/language/ro/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/ro/admin/advanced/database.json +++ b/public/language/ro/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/ro/admin/settings/advanced.json b/public/language/ro/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/ro/admin/settings/advanced.json +++ b/public/language/ro/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ro/admin/settings/pagination.json b/public/language/ro/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/ro/admin/settings/pagination.json +++ b/public/language/ro/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/ro/error.json b/public/language/ro/error.json index e313ea9dc2..84a67253ac 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -78,6 +78,7 @@ "still-uploading": "Te rugăm să aștepți până se termină uploadul.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Nu poți bana alți administratori!", diff --git a/public/language/ro/global.json b/public/language/ro/global.json index edfcbb875a..497b939969 100644 --- a/public/language/ro/global.json +++ b/public/language/ro/global.json @@ -85,6 +85,7 @@ "language": "Limbă", "guest": "Vizitator", "guests": "Vizitatori", + "former_user": "A Former User", "updated.title": "Forumul a fost actualizat", "updated.message": "Acest forum a fost actualizat la ultima version. Apasă aici pentru a reîmprospăta pagina.", "privacy": "Intimitate", diff --git a/public/language/ru/admin/advanced/database.json b/public/language/ru/admin/advanced/database.json index 9687a6b8e9..63177d4dd5 100644 --- a/public/language/ru/admin/advanced/database.json +++ b/public/language/ru/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Мгновенные операции. в секунду", "redis.keyspace-hits": "Количество ключевых просмотров", "redis.keyspace-misses": "Количество не ключевых просмотров", - "redis.raw-info": "Redis необработанная информация" -} \ No newline at end of file + "redis.raw-info": "Redis необработанная информация", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index e303fb5729..6e5a4337cf 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Копировать настройки из", "optional-clone-settings": "(не обязательно) Копировать настройки из", + "clone-children": "Clone Children Categories And Settings", "purge": "Очистить категорию", "enable": "Включить", diff --git a/public/language/ru/admin/settings/advanced.json b/public/language/ru/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/ru/admin/settings/advanced.json +++ b/public/language/ru/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/ru/admin/settings/pagination.json b/public/language/ru/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/ru/admin/settings/pagination.json +++ b/public/language/ru/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index eba9bd45fb..8dfbe08a7d 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -78,6 +78,7 @@ "still-uploading": "Пожалуйста, подождите завершения загрузки.", "file-too-big": "Слишком большой файл. Максимальный размер: %1 Кбайт.", "guest-upload-disabled": "Загрузка файлов для гостей отключена. Чтобы загрузить файл, пожалуйста, войдите или зарегистрируйтесь на сайте.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Эта запись уже есть в закладках", "already-unbookmarked": "Эта запись уже удалена из закладок", "cant-ban-other-admins": "Вы не можете забанить других администраторов", diff --git a/public/language/ru/global.json b/public/language/ru/global.json index 3ee3c9eb24..3060069a43 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -85,6 +85,7 @@ "language": "Язык", "guest": "Гость", "guests": "Гостей", + "former_user": "A Former User", "updated.title": "Форум обновлён", "updated.message": "Форум был обновлён до последней версии. Нажмите здесь, чтобы обновить страницу.", "privacy": "Безопасность", diff --git a/public/language/rw/admin/advanced/database.json b/public/language/rw/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/rw/admin/advanced/database.json +++ b/public/language/rw/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/rw/admin/settings/advanced.json b/public/language/rw/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/rw/admin/settings/advanced.json +++ b/public/language/rw/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/rw/admin/settings/pagination.json b/public/language/rw/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/rw/admin/settings/pagination.json +++ b/public/language/rw/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 5f8d1ee1e9..4771d96a80 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -78,6 +78,7 @@ "still-uploading": "Tegereza gupakira bibanze birangire.", "file-too-big": "Ubunini bwemewe bushoboka bw'ifayilo ni kB %1. Gerageza upakire ifayilo ntoyaho", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Ntabwo wakwirukana abandi bayobozi!", diff --git a/public/language/rw/global.json b/public/language/rw/global.json index 843702bf71..4785a4fb04 100644 --- a/public/language/rw/global.json +++ b/public/language/rw/global.json @@ -85,6 +85,7 @@ "language": "Ururimi", "guest": "Umushyitsi", "guests": "Abashyitsi", + "former_user": "A Former User", "updated.title": "Urubuga Rushyizwe ku Gihe", "updated.message": "Uru rubuga rumaze kuvugururwa. Kanda hano kugirango niba hari ibyahindutse kuri iyi paji bikugereho. ", "privacy": "Umuhezo", diff --git a/public/language/sc/admin/advanced/database.json b/public/language/sc/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/sc/admin/advanced/database.json +++ b/public/language/sc/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/sc/admin/settings/advanced.json b/public/language/sc/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/sc/admin/settings/advanced.json +++ b/public/language/sc/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sc/admin/settings/pagination.json b/public/language/sc/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/sc/admin/settings/pagination.json +++ b/public/language/sc/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/sc/error.json b/public/language/sc/error.json index d0980ccf18..ecad0e0364 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -78,6 +78,7 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", diff --git a/public/language/sc/global.json b/public/language/sc/global.json index ad3f9dfc43..d3d2f5ac82 100644 --- a/public/language/sc/global.json +++ b/public/language/sc/global.json @@ -85,6 +85,7 @@ "language": "Language", "guest": "Guest", "guests": "Guests", + "former_user": "A Former User", "updated.title": "Forum Updated", "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", "privacy": "Privacy", diff --git a/public/language/sk/admin/advanced/database.json b/public/language/sk/admin/advanced/database.json index 3d06384d9e..cb03163a41 100644 --- a/public/language/sk/admin/advanced/database.json +++ b/public/language/sk/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Okamžité spracovanie za sekundu", "redis.keyspace-hits": "Spracovaných kľúčov", "redis.keyspace-misses": "Chyby kľúča", - "redis.raw-info": "Informácie Redis Raw" -} \ No newline at end of file + "redis.raw-info": "Informácie Redis Raw", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 7ac496778d..12ab263115 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(nič)", "copy-settings": "Kopírovať nastavenia z", "optional-clone-settings": "Klonovať nastavenia z kategórie (odporúčané)", + "clone-children": "Clone Children Categories And Settings", "purge": "Vyčistiť kategóriu", "enable": "Povoliť", diff --git a/public/language/sk/admin/settings/advanced.json b/public/language/sk/admin/settings/advanced.json index 4f4e8859e1..01bb352312 100644 --- a/public/language/sk/admin/settings/advanced.json +++ b/public/language/sk/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Správa prevádzky", "traffic.help": "NodeBB obsahuje modul, ktorý automaticky zamieta požiadavky pri vysokom vyťažení. Toto nastavenie môžete upraviť tu, hoci východiskové hodnoty sú zaručením úspechu.", "traffic.enable": "Povoliť správu prevádzky", diff --git a/public/language/sk/admin/settings/pagination.json b/public/language/sk/admin/settings/pagination.json index f67a259569..747eb3df2f 100644 --- a/public/language/sk/admin/settings/pagination.json +++ b/public/language/sk/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximálne množstvo príspevkov na stránku", "categories": "Stránkovanie kategórií", "topics-per-page": "Tém na stránku", - "max-topics-per-page": "Maximálne množstvo tém na stránku", - "initial-num-load": "Počiatočný počet tém, ktoré sa majú načítať u neprečítaných, nedávnych a populárnych" + "max-topics-per-page": "Maximálne množstvo tém na stránku" } \ No newline at end of file diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 1c4aacb70b..6f8a9ea066 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -78,6 +78,7 @@ "still-uploading": "Prosím čakajte na dokončenie nahrávania", "file-too-big": "Najväčšia povolená veľkosť obrázka je %1 kB - prosím nahrajte menší súbor", "guest-upload-disabled": "Nahrávanie pre hostí bolo zablokované", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Tento príspevok máte už medzi záložkami", "already-unbookmarked": "Tento príspevok už nemáte medzi záložkami", "cant-ban-other-admins": "Nemôžte zablokovať iných správcov.", diff --git a/public/language/sk/global.json b/public/language/sk/global.json index 3df5c01596..2537129a66 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -85,6 +85,7 @@ "language": "Jazyk", "guest": "Hosť", "guests": "Hostia", + "former_user": "A Former User", "updated.title": "Fórum bolo aktualizované", "updated.message": "Toto fórum bolo práve aktualizované na najnovšiu verziu. Pre aktualizovanie tejto stránky kliknite sem.", "privacy": "Súkromie", diff --git a/public/language/sl/admin/advanced/database.json b/public/language/sl/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/sl/admin/advanced/database.json +++ b/public/language/sl/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/sl/admin/settings/advanced.json b/public/language/sl/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/sl/admin/settings/advanced.json +++ b/public/language/sl/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sl/admin/settings/pagination.json b/public/language/sl/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/sl/admin/settings/pagination.json +++ b/public/language/sl/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/sl/error.json b/public/language/sl/error.json index ff7076fc31..0542e8a768 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -78,6 +78,7 @@ "still-uploading": "Prosimo, počakajte, da se prenosi končajo.", "file-too-big": "Največja dovoljena velikost datoteke je %1 kB - prosimo, naložite manjšo datoteko.", "guest-upload-disabled": "Gostom je prenašanje onemogočeno.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Ne morete izločati drugih skrbnikov!", diff --git a/public/language/sl/global.json b/public/language/sl/global.json index 3782be52ca..884133744e 100644 --- a/public/language/sl/global.json +++ b/public/language/sl/global.json @@ -85,6 +85,7 @@ "language": "Jezik", "guest": "Gost", "guests": "Gosti", + "former_user": "A Former User", "updated.title": "Forum je posodobljen.", "updated.message": "Forum je bil pravkar posodobljen na zadnjo različico. Kliknite tu za osvežitev strani.", "privacy": "Zasebnost", diff --git a/public/language/sr/admin/advanced/database.json b/public/language/sr/admin/advanced/database.json index dfcd8313bd..f73e1758d4 100644 --- a/public/language/sr/admin/advanced/database.json +++ b/public/language/sr/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Trenutno operacija po sekundi", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Sirove informacije o Redis-u" -} \ No newline at end of file + "redis.raw-info": "Sirove informacije o Redis-u", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/sr/admin/settings/advanced.json b/public/language/sr/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/sr/admin/settings/advanced.json +++ b/public/language/sr/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sr/admin/settings/pagination.json b/public/language/sr/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/sr/admin/settings/pagination.json +++ b/public/language/sr/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 9d984cdcf9..cbc757f399 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -78,6 +78,7 @@ "still-uploading": "Сачекајте док се отпремања не заврше.", "file-too-big": "Највећа дозвољена величина датотеке је %1 kB - отпремите мању датотеку.", "guest-upload-disabled": "Гостима је онемогућено отпремање", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Већ сте додали ову поруку у обележиваче", "already-unbookmarked": "Већ сте одстранили ову поруку из обележивача", "cant-ban-other-admins": "Не можете забранити друге администраторе!", diff --git a/public/language/sr/global.json b/public/language/sr/global.json index be71c2e2f3..075ba4b8e0 100644 --- a/public/language/sr/global.json +++ b/public/language/sr/global.json @@ -85,6 +85,7 @@ "language": "Језик", "guest": "Гост", "guests": "Гости", + "former_user": "A Former User", "updated.title": "Форум је ажуриран", "updated.message": "Форум је управо ажуриран на последњу верзију. Кликните овде да бисте освежили страницу.", "privacy": "Приватност", diff --git a/public/language/sv/admin/advanced/database.json b/public/language/sv/admin/advanced/database.json index b88ca6fc82..b5351b91e4 100644 --- a/public/language/sv/admin/advanced/database.json +++ b/public/language/sv/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/sv/admin/settings/advanced.json b/public/language/sv/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/sv/admin/settings/advanced.json +++ b/public/language/sv/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/sv/admin/settings/pagination.json b/public/language/sv/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/sv/admin/settings/pagination.json +++ b/public/language/sv/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 63ad3646e9..d350987e88 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -78,6 +78,7 @@ "still-uploading": "Vänta medan uppladdningen slutförs.", "file-too-big": "Den maximalt tillåtna filstorleken är %1 kB - var god ladda upp en mindre fil", "guest-upload-disabled": "Uppladdningar av oregistrerade användare har inaktiverats", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Du har redan bokmärkt det här inlägget", "already-unbookmarked": "Du har redan tagit bort bokmärket för det här inlägget", "cant-ban-other-admins": "Du kan inte bannlysa andra administratörer!", diff --git a/public/language/sv/global.json b/public/language/sv/global.json index 4698438759..55a92c665a 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -85,6 +85,7 @@ "language": "Språk", "guest": "Anonym", "guests": "Anonyma", + "former_user": "A Former User", "updated.title": "Forumet uppdaterades", "updated.message": "Det här forumet har nu uppdaterats till senaste versionen. Klicka här för att ladda om sidan.", "privacy": "Integritet", diff --git a/public/language/th/admin/advanced/database.json b/public/language/th/admin/advanced/database.json index 7d329f4ad9..00534c5218 100644 --- a/public/language/th/admin/advanced/database.json +++ b/public/language/th/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "การทำงานพร้อมกันต่อวินาที", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "ข้อมูลดิบของ Redis" -} \ No newline at end of file + "redis.raw-info": "ข้อมูลดิบของ Redis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/th/admin/settings/advanced.json b/public/language/th/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/th/admin/settings/advanced.json +++ b/public/language/th/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/th/admin/settings/pagination.json b/public/language/th/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/th/admin/settings/pagination.json +++ b/public/language/th/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/th/error.json b/public/language/th/error.json index 11eaabfbe1..35cc361073 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -78,6 +78,7 @@ "still-uploading": "กรุณารอการอัพโหลดเพื่อเสร็จสิ้น", "file-too-big": "ขนาดไฟล์ที่ใหญ่ที่สุดที่ได้รับการอนุญาตคือ %1 kB - กรุณาอัพโหลดไฟล์ที่เล็กลง", "guest-upload-disabled": "การอัพโหลดของ Guest ถูกปิด", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "คุณได้ติดบุ๊กมาร์คของโพสต์นี้แล้ว", "already-unbookmarked": "คุณได้ลบบุ๊กมาร์คของโพสต์นี้แล้ว", "cant-ban-other-admins": "คุณแบนแอดมินไม่ได้!!!", diff --git a/public/language/th/global.json b/public/language/th/global.json index e37a98ad11..383f0fb614 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -85,6 +85,7 @@ "language": "ภาษา", "guest": "แขก", "guests": "แขก", + "former_user": "A Former User", "updated.title": "ฟอรั่มที่ถูกอัพเดทแล้ว", "updated.message": "ฟอรั่มนี้เพิ่งได้รับการอัพเดทให้เป็นเวอร์ชั่นล่าสุด คลิกที่นี่เพื่อรีเฟรชหน้าเพจ", "privacy": "ความเป็นส่วนตัว", diff --git a/public/language/tr/admin/advanced/database.json b/public/language/tr/admin/advanced/database.json index 49e18dcb26..9677f68c3f 100644 --- a/public/language/tr/admin/advanced/database.json +++ b/public/language/tr/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Saniyede işlenen komut sayısı (Redis)", "redis.keyspace-hits": "Başarılı anahtar arama sayısı: keyspace_hits (Redis)", "redis.keyspace-misses": "Başarısız anahtar arama sayısı: keyspace_misses (Redis)", - "redis.raw-info": "İşlenmemiş Redis Bilgisi" -} \ No newline at end of file + "redis.raw-info": "İşlenmemiş Redis Bilgisi", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Sürüm", + "postgres.raw-info": "İşlenmemiş Postgres Bilgisi" +} diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 6f9c1b3bfb..c95bade447 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Hiçbiri)", "copy-settings": "Ayarları Başka Bir Yerden Kopyala", "optional-clone-settings": "(İsteğe Bağlı) Kategoriden Ayarları Klonla", + "clone-children": "Alt Kategori ve Ayarlarını Çoğalt", "purge": "Kategoriyi Temizle", "enable": "Etkinleştir", diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index 6c0df1b8cc..b42214961c 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -74,7 +74,7 @@ "search.keep-typing": "Sonuçları görmek için daha fazla yazın...", "search.start-typing": "Sonuçları görmek için yazmaya başlayın...", - "connection-lost": "% 1 ile bağlantı kesildi, yeniden bağlanılmaya çalışılıyor...", + "connection-lost": "%1 ile bağlantı kesildi, yeniden bağlanılmaya çalışılıyor...", "alerts.version": "NodeBB v%1", "alerts.upgrade": "Güncelle: v%1" diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index 3c959f5b1c..55f62c5e02 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Erişim-Kontrolü-Yöntem-İzni", "headers.acah": "Erişim-Kontrolü-Başlık-İzni", "hsts": "STS", + "hsts.enabled": "HSTS'yi etkinleştir (önerilir)", "hsts.subdomains": "Alt alanları HSTS üstbilgisine ekle", "hsts.preload": "HSTS üst bilgisinin ön yüklemesine izin ver", - "hsts.help": "Bu site için bir HSTS başlığı önceden yapılandırılmıştır. Alt alanları ve önyükleme bayraklarını dahil etmeyi seçebilirsiniz. Kararsızsanız, bu alanı işaretlenmemiş olarak bırakabilirsiniz. Daha fazla bilgi ", + "hsts.help": "Etkinleştirildiğinde, bu site için bir HSTS başlığı ayarlanır. Alt alanları ve önyükleme bayraklarını dahil etmeyi seçebilirsiniz. Kararsızsanız, bu alanı işaretlenmemiş olarak bırakabilirsiniz. Daha fazla bilgi ", "traffic-management": "Trafik Yönetimi", "traffic.help": "NodeBB, yoğun trafik isteklerini otomatik olarak reddeden bir modül ile donatılmıştır. Varsayıla ayarlar başlangıç için yeterli olsa da, bu ayarları buradan düzenleyebilirsiniz.", "traffic.enable": "Trafik Yönetimini Etkinleştir", diff --git a/public/language/tr/admin/settings/pagination.json b/public/language/tr/admin/settings/pagination.json index 6423804396..7c03d3e3f3 100644 --- a/public/language/tr/admin/settings/pagination.json +++ b/public/language/tr/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Sayfa başına azami gönderi sayısı", "categories": "Kategori Sayfalama", "topics-per-page": "Sayfa başına Konular", - "max-topics-per-page": "Sayfa başına azami konu", - "initial-num-load": "Okunmamış, Son ve Popülere Başlangıçta Yüklenecek Konu Sayısı" + "max-topics-per-page": "Sayfa başına azami konu" } \ No newline at end of file diff --git a/public/language/tr/error.json b/public/language/tr/error.json index e9e608184c..f52c6cbad9 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -78,6 +78,7 @@ "still-uploading": "Lütfen yüklemelerin bitmesini bekleyin.", "file-too-big": "İzin verilen en büyük dosya boyutu %1 kb - lütfen daha küçük bir dosya yükleyin", "guest-upload-disabled": "Ziyaretçilerin yükleme yapması devre dışı bırakıldı", + "cors-error": "Yanlış yapılandırılmış CORS nedeniyle resim yüklenemiyor", "already-bookmarked": "Bu iletiyi yer imine ekledin", "already-unbookmarked": "Bu iletiyi yer iminden çıkardın", "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", diff --git a/public/language/tr/global.json b/public/language/tr/global.json index a5e968f47c..71eebb14e8 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -85,6 +85,7 @@ "language": "Dil", "guest": "Ziyaretçi", "guests": "Ziyaretçiler", + "former_user": "Eski Kullanıcı", "updated.title": "Forum güncellendi", "updated.message": "Bu forum şu anda güncellendi. Sayfayı tekrar yüklemek için buraya tıklayın.", "privacy": "Gizlilik", diff --git a/public/language/uk/admin/advanced/database.json b/public/language/uk/admin/advanced/database.json index 3c4dc1cd6f..9d56ccfe31 100644 --- a/public/language/uk/admin/advanced/database.json +++ b/public/language/uk/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Кількість миттєвих операції в секунду", "redis.keyspace-hits": "Попадання в ключах", "redis.keyspace-misses": "Промахи в ключах", - "redis.raw-info": "Сирі дані від Redis" -} \ No newline at end of file + "redis.raw-info": "Сирі дані від Redis", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index ca21065d91..c6891d4b88 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(Жодна)", "copy-settings": "Взяти налаштування з", "optional-clone-settings": "(Необов'язково) Взяти налаштування з категорії", + "clone-children": "Clone Children Categories And Settings", "purge": "Видалити категорію", "enable": "Увімкнути", diff --git a/public/language/uk/admin/settings/advanced.json b/public/language/uk/admin/settings/advanced.json index 617b95dc78..c48fa16ccb 100644 --- a/public/language/uk/admin/settings/advanced.json +++ b/public/language/uk/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Керування трафіком", "traffic.help": "NodeBB має модуль автоматичного відхилення запитів у разі надмірного напливу користувачів. Ви можете налаштувати цей модуль тут, хоча типові налаштування є достатньо дієвими.", "traffic.enable": "Увімкнути керування трафіком", diff --git a/public/language/uk/admin/settings/pagination.json b/public/language/uk/admin/settings/pagination.json index e874e8d249..77d8eef143 100644 --- a/public/language/uk/admin/settings/pagination.json +++ b/public/language/uk/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Максимум постів на сторінку", "categories": "Пагінація категорій", "topics-per-page": "Тем на сторінку", - "max-topics-per-page": "Максимум тем на сторінку", - "initial-num-load": "Початкова кількість тем для завантаження в Непрочитаних, Недавніх та Популярних" + "max-topics-per-page": "Максимум тем на сторінку" } \ No newline at end of file diff --git a/public/language/uk/error.json b/public/language/uk/error.json index dce0764096..d42009e9df 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -78,6 +78,7 @@ "still-uploading": "Зачекайте, будь ласка, доки завантаження завершиться.", "file-too-big": "Максимальний розмір файлу %1 кБ — завантажте менший файл, будь ласка.", "guest-upload-disabled": "Гостьове завантаження вимкнено.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Ви вже додали цей пост собі в закладки", "already-unbookmarked": "Ви вже видалили цей пост із закладок", "cant-ban-other-admins": "Ви не можете банити інших адмінів!", diff --git a/public/language/uk/global.json b/public/language/uk/global.json index 33affd6d33..fc0909af13 100644 --- a/public/language/uk/global.json +++ b/public/language/uk/global.json @@ -85,6 +85,7 @@ "language": "Мова", "guest": "Гість", "guests": "Гості", + "former_user": "A Former User", "updated.title": "Форум оновлено", "updated.message": "Форум було щойно оновлено до останньої версії. Клікніть тут, щоб оновити сторінку.", "privacy": "Приватність", diff --git a/public/language/vi/admin/advanced/database.json b/public/language/vi/admin/advanced/database.json index 29e08a3f7b..65267512bf 100644 --- a/public/language/vi/admin/advanced/database.json +++ b/public/language/vi/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" -} \ No newline at end of file + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/vi/admin/settings/advanced.json b/public/language/vi/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/vi/admin/settings/advanced.json +++ b/public/language/vi/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/vi/admin/settings/pagination.json b/public/language/vi/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/vi/admin/settings/pagination.json +++ b/public/language/vi/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 313c909daa..b6c79d1132 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -78,6 +78,7 @@ "still-uploading": "Vui lòng chờ upload", "file-too-big": "Kích cỡ file được cho phép tối đa là %1 kB - vui lòng tải lên file có dung lượng nhỏ hơn.", "guest-upload-disabled": "Khách (chưa có tài khoản) không có quyền tải lên file.", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "Bạn đã bookmark chủ đề này rồi", "already-unbookmarked": "Bạn đã hủy bookmark chủ đề này rồi", "cant-ban-other-admins": "Bạn không thể cấm được các quản trị viên khác", diff --git a/public/language/vi/global.json b/public/language/vi/global.json index 759d9f4555..b731a56141 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -85,6 +85,7 @@ "language": "Ngôn ngữ", "guest": "Khách", "guests": "Số khách", + "former_user": "A Former User", "updated.title": "Cập nhật diễn đàn", "updated.message": "Diễn đàn đã được cập nhật bản mới nhất. Click vào đây để tải lại trang.", "privacy": "Quyền riêng tư", diff --git a/public/language/zh-CN/admin/advanced/database.json b/public/language/zh-CN/admin/advanced/database.json index f8487c7fcb..ae1d2e8e21 100644 --- a/public/language/zh-CN/admin/advanced/database.json +++ b/public/language/zh-CN/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "每秒实时操作数", "redis.keyspace-hits": "Keyspace 命中", "redis.keyspace-misses": "Keyspace 未命中", - "redis.raw-info": "Redis 原始信息" -} \ No newline at end of file + "redis.raw-info": "Redis 原始信息", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 74c3fd4d37..d1633a6830 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(无)", "copy-settings": "复制设置", "optional-clone-settings": "(可选) 从版块复制设置", + "clone-children": "Clone Children Categories And Settings", "purge": "删除版块", "enable": "启用", diff --git a/public/language/zh-CN/admin/settings/advanced.json b/public/language/zh-CN/admin/settings/advanced.json index e529e0b7f0..966acd6148 100644 --- a/public/language/zh-CN/admin/settings/advanced.json +++ b/public/language/zh-CN/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "严格安全传输(HSTS)", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "HSTS头信息包含的域名", "hsts.preload": "允许在HSTS头信息中预加载(preloading)", - "hsts.help": "可以为此站点预配置HSTS头信息了。您可以选择是否在头信息(HSTS Hesder)中添加子域(subdomains)或预加载(preloading)标志。 如果你不知道HSTS是什么,您可以不设置此项。更多信息", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "流量管理", "traffic.help": "NodeBB 拥有在高流量情况下自动拒绝请求的模块。尽管默认值就很棒,但您可以在这里调整这些设置。", "traffic.enable": "启用流量管理", diff --git a/public/language/zh-CN/admin/settings/pagination.json b/public/language/zh-CN/admin/settings/pagination.json index 09574f358e..87ab24c045 100644 --- a/public/language/zh-CN/admin/settings/pagination.json +++ b/public/language/zh-CN/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "每页最多帖子数", "categories": "版块分页", "topics-per-page": "每页主题数", - "max-topics-per-page": "每页最多主题数", - "initial-num-load": "最初加载未读,最新,热门的话题" + "max-topics-per-page": "每页最多主题数" } \ No newline at end of file diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index bd9d69425c..c0c59e797f 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -78,6 +78,7 @@ "still-uploading": "请等待上传完成", "file-too-big": "上传文件的大小限制为 %1 KB - 请缩减文件大小", "guest-upload-disabled": "未登录用户不允许上传", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "您已将此贴存为了书签", "already-unbookmarked": "您已取消了此贴的书签", "cant-ban-other-admins": "您不能封禁其他管理员!", diff --git a/public/language/zh-CN/global.json b/public/language/zh-CN/global.json index 4302adb6b6..7d5cfefc30 100644 --- a/public/language/zh-CN/global.json +++ b/public/language/zh-CN/global.json @@ -85,6 +85,7 @@ "language": "语言", "guest": "游客", "guests": "游客", + "former_user": "A Former User", "updated.title": "论坛已更新", "updated.message": "论坛已更新。请点这里刷新页面。", "privacy": "隐私", diff --git a/public/language/zh-TW/admin/advanced/database.json b/public/language/zh-TW/admin/advanced/database.json index 66a71edae9..85b4805eac 100644 --- a/public/language/zh-TW/admin/advanced/database.json +++ b/public/language/zh-TW/admin/advanced/database.json @@ -32,5 +32,9 @@ "redis.iops": "每秒操作數量", "redis.keyspace-hits": "鍵空間命中次數", "redis.keyspace-misses": "鍵空間未命中次數", - "redis.raw-info": "Redis 原始資料" -} \ No newline at end of file + "redis.raw-info": "Redis 原始資料", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index 6aa607612d..758785d689 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -19,6 +19,7 @@ "parent-category-none": "(None)", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", "purge": "Purge Category", "enable": "Enable", diff --git a/public/language/zh-TW/admin/settings/advanced.json b/public/language/zh-TW/admin/settings/advanced.json index e4070ab7be..f989898d05 100644 --- a/public/language/zh-TW/admin/settings/advanced.json +++ b/public/language/zh-TW/admin/settings/advanced.json @@ -13,9 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "An HSTS header is already pre-configured for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", "traffic-management": "Traffic Management", "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", "traffic.enable": "Enable Traffic Management", diff --git a/public/language/zh-TW/admin/settings/pagination.json b/public/language/zh-TW/admin/settings/pagination.json index d565e2d446..3eb210243e 100644 --- a/public/language/zh-TW/admin/settings/pagination.json +++ b/public/language/zh-TW/admin/settings/pagination.json @@ -6,6 +6,5 @@ "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", "topics-per-page": "Topics per Page", - "max-topics-per-page": "Maximum topics per page", - "initial-num-load": "Initial Number of Topics to Load on Unread, Recent, and Popular" + "max-topics-per-page": "Maximum topics per page" } \ No newline at end of file diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 504d8e418a..21f2fcfec7 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -78,6 +78,7 @@ "still-uploading": "請等待上傳完成。", "file-too-big": "最大允許的檔案大小是 %1 kB - 請上傳一個小於這個數值的檔案。", "guest-upload-disabled": "訪客上傳是被禁止的", + "cors-error": "Unable to upload image due to misconfigured CORS", "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "你無法封鎖其他的管理員!", diff --git a/public/language/zh-TW/global.json b/public/language/zh-TW/global.json index abb6ef0ab5..2ef28ccf7a 100644 --- a/public/language/zh-TW/global.json +++ b/public/language/zh-TW/global.json @@ -85,6 +85,7 @@ "language": "語言", "guest": "訪客", "guests": "訪客", + "former_user": "A Former User", "updated.title": "討論區已更新", "updated.message": "這個討論區最近已更新至最新的版本。點擊此處來重整這個頁面。", "privacy": "隱私", From aaa9561b7f6c474a9ec497a531a9c2e99af36b8f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 26 Aug 2018 00:07:56 -0400 Subject: [PATCH 124/310] Revert "moved filter:post.getPostSummaryByPids to before parsePosts call" This reverts commit cf82407a8f559d444d5d11536c052ec812b20755. --- src/posts/summary.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/posts/summary.js b/src/posts/summary.js index 24090a01ee..139fea16a8 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -78,16 +78,13 @@ module.exports = function (Posts) { return results.topics[post.tid]; }); - next(null, posts); + parsePosts(posts, options, next); }, function (posts, next) { plugins.fireHook('filter:post.getPostSummaryByPids', { posts: posts, uid: uid }, next); }, function (data, next) { - parsePosts(data.posts, options, next); - }, - function (posts, next) { - next(null, posts); + next(null, data.posts); }, ], callback); }; From e56b6daee44870a761d80f67ba44694cd22a8652 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 26 Aug 2018 09:31:47 +0000 Subject: [PATCH 125/310] Latest translations and fallbacks --- public/language/pl/admin/advanced/database.json | 4 ++-- public/language/pl/admin/manage/categories.json | 2 +- public/language/pl/admin/settings/advanced.json | 4 ++-- public/language/pl/error.json | 2 +- public/language/pl/global.json | 2 +- public/language/zh-CN/admin/advanced/database.json | 4 ++-- public/language/zh-CN/admin/manage/categories.json | 2 +- public/language/zh-CN/uploads.json | 4 ++-- public/language/zh-CN/user.json | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/language/pl/admin/advanced/database.json b/public/language/pl/admin/advanced/database.json index 58a7b540fd..322804336c 100644 --- a/public/language/pl/admin/advanced/database.json +++ b/public/language/pl/admin/advanced/database.json @@ -35,6 +35,6 @@ "redis.raw-info": "Informacje Redis", "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", - "postgres.raw-info": "Postgres Raw Info" + "postgres.version": "Wersja PostgreSQL", + "postgres.raw-info": "Informacje PostgreSQL" } diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 8757fad402..fc27c32764 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -19,7 +19,7 @@ "parent-category-none": "(Żadna)", "copy-settings": "Skopiuj ustawienia z", "optional-clone-settings": "(Opcjonalnie) Skopiowanie ustawień z kategorii", - "clone-children": "Clone Children Categories And Settings", + "clone-children": "Sklonuj podrzędne kategorie i ustawienia", "purge": "Usuń kategorię", "enable": "Włącz", diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index a0deb8ce17..de62a62997 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -13,10 +13,10 @@ "headers.acam": "Kontrola-Dostępu-Zezwól-Metody", "headers.acah": "Kontrola-Dostępu-Zezwól-Nagłówki", "hsts": "Strict Transport Security", - "hsts.enabled": "Enabled HSTS (recommended)", + "hsts.enabled": "Włączony HSTS (zalecane)", "hsts.subdomains": "Uwzględnij subdomeny w nagłówku HSTS", "hsts.preload": "Zezwól na wstępne ładowanie nagłówka HSTS", - "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "Jeśli ta opcja jest włączona, dla tej witryny zostanie ustawiony nagłówek HSTS. Możesz zdecydować, czy uwzględnić subdomeny i wstępnie ładować flagi w nagłówku. Jeśli masz wątpliwości, możesz zostawić te pola niezaznaczone. Więcej informacji", "traffic-management": "Zarządzanie ruchem", "traffic.help": "System NodeBB jest dostarczany z modułem, który automatycznie blokuje żądania w przypadku nadmiernego ruchu. Tutaj możesz zmienić te ustawienia, ale ustawienia początkowe są dobrym punktem wyjścia w większości sytuacji.", "traffic.enable": "Włącz zarządzanie ruchem", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 138e96902c..0c66e700ab 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -78,7 +78,7 @@ "still-uploading": "Poczekaj na zakończenie przesyłania", "file-too-big": "Maksymalny dopuszczalny rozmiar pliku to %1 kB – prześlij mniejszy plik", "guest-upload-disabled": "Przesyłanie plików przez gości zostało wyłączone", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Nie można przesłać obrazu z powodu źle skonfigurowanego CORS", "already-bookmarked": "Już dodałeś ten post do zakładek", "already-unbookmarked": "Już usunąłeś ten post z zakładek", "cant-ban-other-admins": "Nie możesz zbanować innych adminów!", diff --git a/public/language/pl/global.json b/public/language/pl/global.json index a4e829447a..ae7ad01b3f 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -85,7 +85,7 @@ "language": "Język", "guest": "Gość", "guests": "Goście", - "former_user": "A Former User", + "former_user": "Dawny użytkownik", "updated.title": "Forum zaktualizowane", "updated.message": "To forum zostało zaktualizowane do najnowszej wersji. Kliknij tutaj, by odświeżyć stronę.", "privacy": "Prywatność", diff --git a/public/language/zh-CN/admin/advanced/database.json b/public/language/zh-CN/admin/advanced/database.json index ae1d2e8e21..5e51bc70fc 100644 --- a/public/language/zh-CN/admin/advanced/database.json +++ b/public/language/zh-CN/admin/advanced/database.json @@ -35,6 +35,6 @@ "redis.raw-info": "Redis 原始信息", "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", - "postgres.raw-info": "Postgres Raw Info" + "postgres.version": "PostgreSQL 版本", + "postgres.raw-info": "Postgres 原始信息" } diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index d1633a6830..974c4a8e88 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -19,7 +19,7 @@ "parent-category-none": "(无)", "copy-settings": "复制设置", "optional-clone-settings": "(可选) 从版块复制设置", - "clone-children": "Clone Children Categories And Settings", + "clone-children": "克隆子类别并进行设置", "purge": "删除版块", "enable": "启用", diff --git a/public/language/zh-CN/uploads.json b/public/language/zh-CN/uploads.json index d2ed828706..568ce71767 100644 --- a/public/language/zh-CN/uploads.json +++ b/public/language/zh-CN/uploads.json @@ -4,6 +4,6 @@ "upload-success": "文件上传成功!", "maximum-file-size": "最大 %1 kb", "no-uploads-found": "没有找到上传文件", - "public-uploads-info": "上传文件是公开的,所有访客均可见。", - "private-uploads-info": "上传文件是私有的,仅登陆用户可见。" + "public-uploads-info": "上传公开的文件,所有访客均可查看。", + "private-uploads-info": "上传私有的文件,仅登陆用户可见。" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 5544cd15a4..d67795ddb5 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -52,7 +52,7 @@ "default_picture": "默认图标", "uploaded_picture": "已有头像", "upload_new_picture": "上传新头像", - "upload_new_picture_from_url": "从 URL 上传新图片", + "upload_new_picture_from_url": "上传来自URL的新头像", "current_password": "当前密码", "change_password": "更改密码", "change_password_error": "无效的密码!", From 9e2e32500a7b0adc4c63ac02f6bb307674a43705 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 27 Aug 2018 08:21:07 +0000 Subject: [PATCH 126/310] Update dependency smtp-server to v3.4.7 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e937099b85..c910abfd77 100644 --- a/install/package.json +++ b/install/package.json @@ -126,7 +126,7 @@ "mocha": "5.2.0", "mocha-lcov-reporter": "1.3.0", "nyc": "12.0.2", - "smtp-server": "3.4.6" + "smtp-server": "3.4.7" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" From 40b453e9fdfb7ba8d7298e71196ef2d6ed2d4eb6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 19 Aug 2018 21:21:24 +0000 Subject: [PATCH 127/310] Update dependency jsdom to v12 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c910abfd77..7885611a34 100644 --- a/install/package.json +++ b/install/package.json @@ -122,7 +122,7 @@ "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", "grunt-contrib-watch": "1.1.0", - "jsdom": "11.11.0", + "jsdom": "12.0.0", "mocha": "5.2.0", "mocha-lcov-reporter": "1.3.0", "nyc": "12.0.2", From 8618afb45d492e583cf36d06479eb8eca0664038 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 27 Aug 2018 10:27:53 -0400 Subject: [PATCH 128/310] added Latvian localisation strings --- .tx/config | 68 +++++++ public/language/lv/admin/admin.json | 7 + public/language/lv/admin/advanced/cache.json | 11 ++ .../language/lv/admin/advanced/database.json | 40 ++++ public/language/lv/admin/advanced/errors.json | 14 ++ public/language/lv/admin/advanced/events.json | 6 + public/language/lv/admin/advanced/logs.json | 7 + .../lv/admin/appearance/customise.json | 16 ++ .../language/lv/admin/appearance/skins.json | 9 + .../language/lv/admin/appearance/themes.json | 11 ++ .../language/lv/admin/development/info.json | 18 ++ .../language/lv/admin/development/logger.json | 12 ++ public/language/lv/admin/extend/plugins.json | 53 ++++++ public/language/lv/admin/extend/rewards.json | 17 ++ public/language/lv/admin/extend/widgets.json | 22 +++ .../language/lv/admin/general/dashboard.json | 73 ++++++++ .../language/lv/admin/general/homepage.json | 8 + .../language/lv/admin/general/languages.json | 6 + .../language/lv/admin/general/navigation.json | 25 +++ public/language/lv/admin/general/social.json | 5 + public/language/lv/admin/general/sounds.json | 9 + .../language/lv/admin/manage/admins-mods.json | 10 + .../language/lv/admin/manage/categories.json | 72 ++++++++ public/language/lv/admin/manage/groups.json | 35 ++++ .../lv/admin/manage/ip-blacklist.json | 19 ++ .../language/lv/admin/manage/post-queue.json | 11 ++ .../language/lv/admin/manage/privileges.json | 29 +++ .../lv/admin/manage/registration.json | 20 ++ public/language/lv/admin/manage/tags.json | 19 ++ public/language/lv/admin/manage/users.json | 99 ++++++++++ public/language/lv/admin/menu.json | 81 ++++++++ .../language/lv/admin/settings/advanced.json | 27 +++ public/language/lv/admin/settings/chat.json | 11 ++ .../language/lv/admin/settings/cookies.json | 11 ++ public/language/lv/admin/settings/email.json | 37 ++++ .../language/lv/admin/settings/general.json | 35 ++++ public/language/lv/admin/settings/group.json | 13 ++ public/language/lv/admin/settings/guest.json | 5 + .../lv/admin/settings/notifications.json | 7 + .../lv/admin/settings/pagination.json | 10 + public/language/lv/admin/settings/post.json | 54 ++++++ .../lv/admin/settings/reputation.json | 14 ++ .../language/lv/admin/settings/sockets.json | 6 + public/language/lv/admin/settings/tags.json | 12 ++ .../language/lv/admin/settings/uploads.json | 32 ++++ public/language/lv/admin/settings/user.json | 67 +++++++ .../lv/admin/settings/web-crawler.json | 10 + public/language/lv/category.json | 20 ++ public/language/lv/email.json | 44 +++++ public/language/lv/error.json | 156 ++++++++++++++++ public/language/lv/flags.json | 65 +++++++ public/language/lv/global.json | 113 ++++++++++++ public/language/lv/groups.json | 59 ++++++ public/language/lv/language.json | 5 + public/language/lv/login.json | 12 ++ public/language/lv/modules.json | 62 +++++++ public/language/lv/notifications.json | 64 +++++++ public/language/lv/pages.json | 61 ++++++ public/language/lv/recent.json | 19 ++ public/language/lv/register.json | 26 +++ public/language/lv/reset_password.json | 17 ++ public/language/lv/search.json | 45 +++++ public/language/lv/success.json | 7 + public/language/lv/tags.json | 7 + public/language/lv/topic.json | 133 ++++++++++++++ public/language/lv/unread.json | 15 ++ public/language/lv/uploads.json | 9 + public/language/lv/user.json | 173 ++++++++++++++++++ public/language/lv/users.json | 21 +++ 69 files changed, 2316 insertions(+) create mode 100644 public/language/lv/admin/admin.json create mode 100644 public/language/lv/admin/advanced/cache.json create mode 100644 public/language/lv/admin/advanced/database.json create mode 100644 public/language/lv/admin/advanced/errors.json create mode 100644 public/language/lv/admin/advanced/events.json create mode 100644 public/language/lv/admin/advanced/logs.json create mode 100644 public/language/lv/admin/appearance/customise.json create mode 100644 public/language/lv/admin/appearance/skins.json create mode 100644 public/language/lv/admin/appearance/themes.json create mode 100644 public/language/lv/admin/development/info.json create mode 100644 public/language/lv/admin/development/logger.json create mode 100644 public/language/lv/admin/extend/plugins.json create mode 100644 public/language/lv/admin/extend/rewards.json create mode 100644 public/language/lv/admin/extend/widgets.json create mode 100644 public/language/lv/admin/general/dashboard.json create mode 100644 public/language/lv/admin/general/homepage.json create mode 100644 public/language/lv/admin/general/languages.json create mode 100644 public/language/lv/admin/general/navigation.json create mode 100644 public/language/lv/admin/general/social.json create mode 100644 public/language/lv/admin/general/sounds.json create mode 100644 public/language/lv/admin/manage/admins-mods.json create mode 100644 public/language/lv/admin/manage/categories.json create mode 100644 public/language/lv/admin/manage/groups.json create mode 100644 public/language/lv/admin/manage/ip-blacklist.json create mode 100644 public/language/lv/admin/manage/post-queue.json create mode 100644 public/language/lv/admin/manage/privileges.json create mode 100644 public/language/lv/admin/manage/registration.json create mode 100644 public/language/lv/admin/manage/tags.json create mode 100644 public/language/lv/admin/manage/users.json create mode 100644 public/language/lv/admin/menu.json create mode 100644 public/language/lv/admin/settings/advanced.json create mode 100644 public/language/lv/admin/settings/chat.json create mode 100644 public/language/lv/admin/settings/cookies.json create mode 100644 public/language/lv/admin/settings/email.json create mode 100644 public/language/lv/admin/settings/general.json create mode 100644 public/language/lv/admin/settings/group.json create mode 100644 public/language/lv/admin/settings/guest.json create mode 100644 public/language/lv/admin/settings/notifications.json create mode 100644 public/language/lv/admin/settings/pagination.json create mode 100644 public/language/lv/admin/settings/post.json create mode 100644 public/language/lv/admin/settings/reputation.json create mode 100644 public/language/lv/admin/settings/sockets.json create mode 100644 public/language/lv/admin/settings/tags.json create mode 100644 public/language/lv/admin/settings/uploads.json create mode 100644 public/language/lv/admin/settings/user.json create mode 100644 public/language/lv/admin/settings/web-crawler.json create mode 100644 public/language/lv/category.json create mode 100644 public/language/lv/email.json create mode 100644 public/language/lv/error.json create mode 100644 public/language/lv/flags.json create mode 100644 public/language/lv/global.json create mode 100644 public/language/lv/groups.json create mode 100644 public/language/lv/language.json create mode 100644 public/language/lv/login.json create mode 100644 public/language/lv/modules.json create mode 100644 public/language/lv/notifications.json create mode 100644 public/language/lv/pages.json create mode 100644 public/language/lv/recent.json create mode 100644 public/language/lv/register.json create mode 100644 public/language/lv/reset_password.json create mode 100644 public/language/lv/search.json create mode 100644 public/language/lv/success.json create mode 100644 public/language/lv/tags.json create mode 100644 public/language/lv/topic.json create mode 100644 public/language/lv/unread.json create mode 100644 public/language/lv/uploads.json create mode 100644 public/language/lv/user.json create mode 100644 public/language/lv/users.json diff --git a/.tx/config b/.tx/config index 3a44a0b621..63c455e669 100644 --- a/.tx/config +++ b/.tx/config @@ -28,6 +28,7 @@ trans.it = public/language/it/category.json trans.ja = public/language/ja/category.json trans.ko = public/language/ko/category.json trans.lt = public/language/lt/category.json +trans.lv = public/language/lv/category.json trans.ms = public/language/ms/category.json trans.nb = public/language/nb/category.json trans.nl = public/language/nl/category.json @@ -77,6 +78,7 @@ trans.it = public/language/it/login.json trans.ja = public/language/ja/login.json trans.ko = public/language/ko/login.json trans.lt = public/language/lt/login.json +trans.lv = public/language/lv/login.json trans.ms = public/language/ms/login.json trans.nb = public/language/nb/login.json trans.nl = public/language/nl/login.json @@ -126,6 +128,7 @@ trans.it = public/language/it/recent.json trans.ja = public/language/ja/recent.json trans.ko = public/language/ko/recent.json trans.lt = public/language/lt/recent.json +trans.lv = public/language/lv/recent.json trans.ms = public/language/ms/recent.json trans.nb = public/language/nb/recent.json trans.nl = public/language/nl/recent.json @@ -175,6 +178,7 @@ trans.it = public/language/it/unread.json trans.ja = public/language/ja/unread.json trans.ko = public/language/ko/unread.json trans.lt = public/language/lt/unread.json +trans.lv = public/language/lv/unread.json trans.ms = public/language/ms/unread.json trans.nb = public/language/nb/unread.json trans.nl = public/language/nl/unread.json @@ -224,6 +228,7 @@ trans.it = public/language/it/modules.json trans.ja = public/language/ja/modules.json trans.ko = public/language/ko/modules.json trans.lt = public/language/lt/modules.json +trans.lv = public/language/lv/modules.json trans.ms = public/language/ms/modules.json trans.nb = public/language/nb/modules.json trans.nl = public/language/nl/modules.json @@ -273,6 +278,7 @@ trans.it = public/language/it/register.json trans.ja = public/language/ja/register.json trans.ko = public/language/ko/register.json trans.lt = public/language/lt/register.json +trans.lv = public/language/lv/register.json trans.ms = public/language/ms/register.json trans.nb = public/language/nb/register.json trans.nl = public/language/nl/register.json @@ -322,6 +328,7 @@ trans.it = public/language/it/user.json trans.ja = public/language/ja/user.json trans.ko = public/language/ko/user.json trans.lt = public/language/lt/user.json +trans.lv = public/language/lv/user.json trans.ms = public/language/ms/user.json trans.nb = public/language/nb/user.json trans.nl = public/language/nl/user.json @@ -371,6 +378,7 @@ trans.it = public/language/it/global.json trans.ja = public/language/ja/global.json trans.ko = public/language/ko/global.json trans.lt = public/language/lt/global.json +trans.lv = public/language/lv/global.json trans.ms = public/language/ms/global.json trans.nb = public/language/nb/global.json trans.nl = public/language/nl/global.json @@ -420,6 +428,7 @@ trans.it = public/language/it/notifications.json trans.ja = public/language/ja/notifications.json trans.ko = public/language/ko/notifications.json trans.lt = public/language/lt/notifications.json +trans.lv = public/language/lv/notifications.json trans.ms = public/language/ms/notifications.json trans.nb = public/language/nb/notifications.json trans.nl = public/language/nl/notifications.json @@ -469,6 +478,7 @@ trans.it = public/language/it/reset_password.json trans.ja = public/language/ja/reset_password.json trans.ko = public/language/ko/reset_password.json trans.lt = public/language/lt/reset_password.json +trans.lv = public/language/lv/reset_password.json trans.ms = public/language/ms/reset_password.json trans.nb = public/language/nb/reset_password.json trans.nl = public/language/nl/reset_password.json @@ -518,6 +528,7 @@ trans.it = public/language/it/users.json trans.ja = public/language/ja/users.json trans.ko = public/language/ko/users.json trans.lt = public/language/lt/users.json +trans.lv = public/language/lv/users.json trans.ms = public/language/ms/users.json trans.nb = public/language/nb/users.json trans.nl = public/language/nl/users.json @@ -567,6 +578,7 @@ trans.it = public/language/it/language.json trans.ja = public/language/ja/language.json trans.ko = public/language/ko/language.json trans.lt = public/language/lt/language.json +trans.lv = public/language/lv/language.json trans.ms = public/language/ms/language.json trans.nb = public/language/nb/language.json trans.nl = public/language/nl/language.json @@ -616,6 +628,7 @@ trans.it = public/language/it/pages.json trans.ja = public/language/ja/pages.json trans.ko = public/language/ko/pages.json trans.lt = public/language/lt/pages.json +trans.lv = public/language/lv/pages.json trans.ms = public/language/ms/pages.json trans.nb = public/language/nb/pages.json trans.nl = public/language/nl/pages.json @@ -665,6 +678,7 @@ trans.it = public/language/it/topic.json trans.ja = public/language/ja/topic.json trans.ko = public/language/ko/topic.json trans.lt = public/language/lt/topic.json +trans.lv = public/language/lv/topic.json trans.ms = public/language/ms/topic.json trans.nb = public/language/nb/topic.json trans.nl = public/language/nl/topic.json @@ -714,6 +728,7 @@ trans.it = public/language/it/success.json trans.ja = public/language/ja/success.json trans.ko = public/language/ko/success.json trans.lt = public/language/lt/success.json +trans.lv = public/language/lv/success.json trans.ms = public/language/ms/success.json trans.nb = public/language/nb/success.json trans.nl = public/language/nl/success.json @@ -763,6 +778,7 @@ trans.it = public/language/it/error.json trans.ja = public/language/ja/error.json trans.ko = public/language/ko/error.json trans.lt = public/language/lt/error.json +trans.lv = public/language/lv/error.json trans.ms = public/language/ms/error.json trans.nb = public/language/nb/error.json trans.nl = public/language/nl/error.json @@ -812,6 +828,7 @@ trans.it = public/language/it/flags.json trans.ja = public/language/ja/flags.json trans.ko = public/language/ko/flags.json trans.lt = public/language/lt/flags.json +trans.lv = public/language/lv/flags.json trans.ms = public/language/ms/flags.json trans.nb = public/language/nb/flags.json trans.nl = public/language/nl/flags.json @@ -860,6 +877,7 @@ trans.it = public/language/it/tags.json trans.ja = public/language/ja/tags.json trans.ko = public/language/ko/tags.json trans.lt = public/language/lt/tags.json +trans.lv = public/language/lv/tags.json trans.ms = public/language/ms/tags.json trans.nb = public/language/nb/tags.json trans.nl = public/language/nl/tags.json @@ -909,6 +927,7 @@ trans.it = public/language/it/email.json trans.ja = public/language/ja/email.json trans.ko = public/language/ko/email.json trans.lt = public/language/lt/email.json +trans.lv = public/language/lv/email.json trans.ms = public/language/ms/email.json trans.nb = public/language/nb/email.json trans.nl = public/language/nl/email.json @@ -958,6 +977,7 @@ trans.it = public/language/it/search.json trans.ja = public/language/ja/search.json trans.ko = public/language/ko/search.json trans.lt = public/language/lt/search.json +trans.lv = public/language/lv/search.json trans.ms = public/language/ms/search.json trans.nb = public/language/nb/search.json trans.nl = public/language/nl/search.json @@ -1007,6 +1027,7 @@ trans.it = public/language/it/groups.json trans.ja = public/language/ja/groups.json trans.ko = public/language/ko/groups.json trans.lt = public/language/lt/groups.json +trans.lv = public/language/lv/groups.json trans.ms = public/language/ms/groups.json trans.nb = public/language/nb/groups.json trans.nl = public/language/nl/groups.json @@ -1056,6 +1077,7 @@ trans.it = public/language/it/uploads.json trans.ja = public/language/ja/uploads.json trans.ko = public/language/ko/uploads.json trans.lt = public/language/lt/uploads.json +trans.lv = public/language/lv/uploads.json trans.ms = public/language/ms/uploads.json trans.nb = public/language/nb/uploads.json trans.nl = public/language/nl/uploads.json @@ -1105,6 +1127,7 @@ trans.it = public/language/it/admin/admin.json trans.ja = public/language/ja/admin/admin.json trans.ko = public/language/ko/admin/admin.json trans.lt = public/language/lt/admin/admin.json +trans.lv = public/language/lv/admin/admin.json trans.ms = public/language/ms/admin/admin.json trans.nb = public/language/nb/admin/admin.json trans.nl = public/language/nl/admin/admin.json @@ -1154,6 +1177,7 @@ trans.it = public/language/it/admin/menu.json trans.ja = public/language/ja/admin/menu.json trans.ko = public/language/ko/admin/menu.json trans.lt = public/language/lt/admin/menu.json +trans.lv = public/language/lv/admin/menu.json trans.ms = public/language/ms/admin/menu.json trans.nb = public/language/nb/admin/menu.json trans.nl = public/language/nl/admin/menu.json @@ -1203,6 +1227,7 @@ trans.it = public/language/it/admin/advanced/cache.json trans.ja = public/language/ja/admin/advanced/cache.json trans.ko = public/language/ko/admin/advanced/cache.json trans.lt = public/language/lt/admin/advanced/cache.json +trans.lv = public/language/lv/admin/advanced/cache.json trans.ms = public/language/ms/admin/advanced/cache.json trans.nb = public/language/nb/admin/advanced/cache.json trans.nl = public/language/nl/admin/advanced/cache.json @@ -1252,6 +1277,7 @@ trans.it = public/language/it/admin/advanced/database.json trans.ja = public/language/ja/admin/advanced/database.json trans.ko = public/language/ko/admin/advanced/database.json trans.lt = public/language/lt/admin/advanced/database.json +trans.lv = public/language/lv/admin/advanced/database.json trans.ms = public/language/ms/admin/advanced/database.json trans.nb = public/language/nb/admin/advanced/database.json trans.nl = public/language/nl/admin/advanced/database.json @@ -1301,6 +1327,7 @@ trans.it = public/language/it/admin/advanced/errors.json trans.ja = public/language/ja/admin/advanced/errors.json trans.ko = public/language/ko/admin/advanced/errors.json trans.lt = public/language/lt/admin/advanced/errors.json +trans.lv = public/language/lv/admin/advanced/errors.json trans.ms = public/language/ms/admin/advanced/errors.json trans.nb = public/language/nb/admin/advanced/errors.json trans.nl = public/language/nl/admin/advanced/errors.json @@ -1350,6 +1377,7 @@ trans.it = public/language/it/admin/advanced/events.json trans.ja = public/language/ja/admin/advanced/events.json trans.ko = public/language/ko/admin/advanced/events.json trans.lt = public/language/lt/admin/advanced/events.json +trans.lv = public/language/lv/admin/advanced/events.json trans.ms = public/language/ms/admin/advanced/events.json trans.nb = public/language/nb/admin/advanced/events.json trans.nl = public/language/nl/admin/advanced/events.json @@ -1399,6 +1427,7 @@ trans.it = public/language/it/admin/advanced/logs.json trans.ja = public/language/ja/admin/advanced/logs.json trans.ko = public/language/ko/admin/advanced/logs.json trans.lt = public/language/lt/admin/advanced/logs.json +trans.lv = public/language/lv/admin/advanced/logs.json trans.ms = public/language/ms/admin/advanced/logs.json trans.nb = public/language/nb/admin/advanced/logs.json trans.nl = public/language/nl/admin/advanced/logs.json @@ -1448,6 +1477,7 @@ trans.it = public/language/it/admin/appearance/customise.json trans.ja = public/language/ja/admin/appearance/customise.json trans.ko = public/language/ko/admin/appearance/customise.json trans.lt = public/language/lt/admin/appearance/customise.json +trans.lv = public/language/lv/admin/appearance/customise.json trans.ms = public/language/ms/admin/appearance/customise.json trans.nb = public/language/nb/admin/appearance/customise.json trans.nl = public/language/nl/admin/appearance/customise.json @@ -1497,6 +1527,7 @@ trans.it = public/language/it/admin/appearance/skins.json trans.ja = public/language/ja/admin/appearance/skins.json trans.ko = public/language/ko/admin/appearance/skins.json trans.lt = public/language/lt/admin/appearance/skins.json +trans.lv = public/language/lv/admin/appearance/skins.json trans.ms = public/language/ms/admin/appearance/skins.json trans.nb = public/language/nb/admin/appearance/skins.json trans.nl = public/language/nl/admin/appearance/skins.json @@ -1546,6 +1577,7 @@ trans.it = public/language/it/admin/appearance/themes.json trans.ja = public/language/ja/admin/appearance/themes.json trans.ko = public/language/ko/admin/appearance/themes.json trans.lt = public/language/lt/admin/appearance/themes.json +trans.lv = public/language/lv/admin/appearance/themes.json trans.ms = public/language/ms/admin/appearance/themes.json trans.nb = public/language/nb/admin/appearance/themes.json trans.nl = public/language/nl/admin/appearance/themes.json @@ -1595,6 +1627,7 @@ trans.it = public/language/it/admin/development/info.json trans.ja = public/language/ja/admin/development/info.json trans.ko = public/language/ko/admin/development/info.json trans.lt = public/language/lt/admin/development/info.json +trans.lv = public/language/lv/admin/development/info.json trans.ms = public/language/ms/admin/development/info.json trans.nb = public/language/nb/admin/development/info.json trans.nl = public/language/nl/admin/development/info.json @@ -1644,6 +1677,7 @@ trans.it = public/language/it/admin/development/logger.json trans.ja = public/language/ja/admin/development/logger.json trans.ko = public/language/ko/admin/development/logger.json trans.lt = public/language/lt/admin/development/logger.json +trans.lv = public/language/lv/admin/development/logger.json trans.ms = public/language/ms/admin/development/logger.json trans.nb = public/language/nb/admin/development/logger.json trans.nl = public/language/nl/admin/development/logger.json @@ -1693,6 +1727,7 @@ trans.it = public/language/it/admin/extend/plugins.json trans.ja = public/language/ja/admin/extend/plugins.json trans.ko = public/language/ko/admin/extend/plugins.json trans.lt = public/language/lt/admin/extend/plugins.json +trans.lv = public/language/lv/admin/extend/plugins.json trans.ms = public/language/ms/admin/extend/plugins.json trans.nb = public/language/nb/admin/extend/plugins.json trans.nl = public/language/nl/admin/extend/plugins.json @@ -1742,6 +1777,7 @@ trans.it = public/language/it/admin/extend/rewards.json trans.ja = public/language/ja/admin/extend/rewards.json trans.ko = public/language/ko/admin/extend/rewards.json trans.lt = public/language/lt/admin/extend/rewards.json +trans.lv = public/language/lv/admin/extend/rewards.json trans.ms = public/language/ms/admin/extend/rewards.json trans.nb = public/language/nb/admin/extend/rewards.json trans.nl = public/language/nl/admin/extend/rewards.json @@ -1791,6 +1827,7 @@ trans.it = public/language/it/admin/extend/widgets.json trans.ja = public/language/ja/admin/extend/widgets.json trans.ko = public/language/ko/admin/extend/widgets.json trans.lt = public/language/lt/admin/extend/widgets.json +trans.lv = public/language/lv/admin/extend/widgets.json trans.ms = public/language/ms/admin/extend/widgets.json trans.nb = public/language/nb/admin/extend/widgets.json trans.nl = public/language/nl/admin/extend/widgets.json @@ -1840,6 +1877,7 @@ trans.it = public/language/it/admin/general/dashboard.json trans.ja = public/language/ja/admin/general/dashboard.json trans.ko = public/language/ko/admin/general/dashboard.json trans.lt = public/language/lt/admin/general/dashboard.json +trans.lv = public/language/lv/admin/general/dashboard.json trans.ms = public/language/ms/admin/general/dashboard.json trans.nb = public/language/nb/admin/general/dashboard.json trans.nl = public/language/nl/admin/general/dashboard.json @@ -1889,6 +1927,7 @@ trans.it = public/language/it/admin/general/homepage.json trans.ja = public/language/ja/admin/general/homepage.json trans.ko = public/language/ko/admin/general/homepage.json trans.lt = public/language/lt/admin/general/homepage.json +trans.lv = public/language/lv/admin/general/homepage.json trans.ms = public/language/ms/admin/general/homepage.json trans.nb = public/language/nb/admin/general/homepage.json trans.nl = public/language/nl/admin/general/homepage.json @@ -1938,6 +1977,7 @@ trans.it = public/language/it/admin/general/languages.json trans.ja = public/language/ja/admin/general/languages.json trans.ko = public/language/ko/admin/general/languages.json trans.lt = public/language/lt/admin/general/languages.json +trans.lv = public/language/lv/admin/general/languages.json trans.ms = public/language/ms/admin/general/languages.json trans.nb = public/language/nb/admin/general/languages.json trans.nl = public/language/nl/admin/general/languages.json @@ -1987,6 +2027,7 @@ trans.it = public/language/it/admin/general/navigation.json trans.ja = public/language/ja/admin/general/navigation.json trans.ko = public/language/ko/admin/general/navigation.json trans.lt = public/language/lt/admin/general/navigation.json +trans.lv = public/language/lv/admin/general/navigation.json trans.ms = public/language/ms/admin/general/navigation.json trans.nb = public/language/nb/admin/general/navigation.json trans.nl = public/language/nl/admin/general/navigation.json @@ -2036,6 +2077,7 @@ trans.it = public/language/it/admin/general/social.json trans.ja = public/language/ja/admin/general/social.json trans.ko = public/language/ko/admin/general/social.json trans.lt = public/language/lt/admin/general/social.json +trans.lv = public/language/lv/admin/general/social.json trans.ms = public/language/ms/admin/general/social.json trans.nb = public/language/nb/admin/general/social.json trans.nl = public/language/nl/admin/general/social.json @@ -2085,6 +2127,7 @@ trans.it = public/language/it/admin/general/sounds.json trans.ja = public/language/ja/admin/general/sounds.json trans.ko = public/language/ko/admin/general/sounds.json trans.lt = public/language/lt/admin/general/sounds.json +trans.lv = public/language/lv/admin/general/sounds.json trans.ms = public/language/ms/admin/general/sounds.json trans.nb = public/language/nb/admin/general/sounds.json trans.nl = public/language/nl/admin/general/sounds.json @@ -2134,6 +2177,7 @@ trans.it = public/language/it/admin/manage/admins-mods.json trans.ja = public/language/ja/admin/manage/admins-mods.json trans.ko = public/language/ko/admin/manage/admins-mods.json trans.lt = public/language/lt/admin/manage/admins-mods.json +trans.lv = public/language/lv/admin/manage/admins-mods.json trans.ms = public/language/ms/admin/manage/admins-mods.json trans.nb = public/language/nb/admin/manage/admins-mods.json trans.nl = public/language/nl/admin/manage/admins-mods.json @@ -2183,6 +2227,7 @@ trans.it = public/language/it/admin/manage/categories.json trans.ja = public/language/ja/admin/manage/categories.json trans.ko = public/language/ko/admin/manage/categories.json trans.lt = public/language/lt/admin/manage/categories.json +trans.lv = public/language/lv/admin/manage/categories.json trans.ms = public/language/ms/admin/manage/categories.json trans.nb = public/language/nb/admin/manage/categories.json trans.nl = public/language/nl/admin/manage/categories.json @@ -2232,6 +2277,7 @@ trans.it = public/language/it/admin/manage/groups.json trans.ja = public/language/ja/admin/manage/groups.json trans.ko = public/language/ko/admin/manage/groups.json trans.lt = public/language/lt/admin/manage/groups.json +trans.lv = public/language/lv/admin/manage/groups.json trans.ms = public/language/ms/admin/manage/groups.json trans.nb = public/language/nb/admin/manage/groups.json trans.nl = public/language/nl/admin/manage/groups.json @@ -2281,6 +2327,7 @@ trans.it = public/language/it/admin/manage/ip-blacklist.json trans.ja = public/language/ja/admin/manage/ip-blacklist.json trans.ko = public/language/ko/admin/manage/ip-blacklist.json trans.lt = public/language/lt/admin/manage/ip-blacklist.json +trans.lv = public/language/lv/admin/manage/ip-blacklist.json trans.ms = public/language/ms/admin/manage/ip-blacklist.json trans.nb = public/language/nb/admin/manage/ip-blacklist.json trans.nl = public/language/nl/admin/manage/ip-blacklist.json @@ -2330,6 +2377,7 @@ trans.it = public/language/it/admin/manage/privileges.json trans.ja = public/language/ja/admin/manage/privileges.json trans.ko = public/language/ko/admin/manage/privileges.json trans.lt = public/language/lt/admin/manage/privileges.json +trans.lv = public/language/lv/admin/manage/privileges.json trans.ms = public/language/ms/admin/manage/privileges.json trans.nb = public/language/nb/admin/manage/privileges.json trans.nl = public/language/nl/admin/manage/privileges.json @@ -2379,6 +2427,7 @@ trans.it = public/language/it/admin/manage/post-queue.json trans.ja = public/language/ja/admin/manage/post-queue.json trans.ko = public/language/ko/admin/manage/post-queue.json trans.lt = public/language/lt/admin/manage/post-queue.json +trans.lv = public/language/lv/admin/manage/post-queue.json trans.ms = public/language/ms/admin/manage/post-queue.json trans.nb = public/language/nb/admin/manage/post-queue.json trans.nl = public/language/nl/admin/manage/post-queue.json @@ -2428,6 +2477,7 @@ trans.it = public/language/it/admin/manage/registration.json trans.ja = public/language/ja/admin/manage/registration.json trans.ko = public/language/ko/admin/manage/registration.json trans.lt = public/language/lt/admin/manage/registration.json +trans.lv = public/language/lv/admin/manage/registration.json trans.ms = public/language/ms/admin/manage/registration.json trans.nb = public/language/nb/admin/manage/registration.json trans.nl = public/language/nl/admin/manage/registration.json @@ -2477,6 +2527,7 @@ trans.it = public/language/it/admin/manage/tags.json trans.ja = public/language/ja/admin/manage/tags.json trans.ko = public/language/ko/admin/manage/tags.json trans.lt = public/language/lt/admin/manage/tags.json +trans.lv = public/language/lv/admin/manage/tags.json trans.ms = public/language/ms/admin/manage/tags.json trans.nb = public/language/nb/admin/manage/tags.json trans.nl = public/language/nl/admin/manage/tags.json @@ -2526,6 +2577,7 @@ trans.it = public/language/it/admin/manage/users.json trans.ja = public/language/ja/admin/manage/users.json trans.ko = public/language/ko/admin/manage/users.json trans.lt = public/language/lt/admin/manage/users.json +trans.lv = public/language/lv/admin/manage/users.json trans.ms = public/language/ms/admin/manage/users.json trans.nb = public/language/nb/admin/manage/users.json trans.nl = public/language/nl/admin/manage/users.json @@ -2575,6 +2627,7 @@ trans.it = public/language/it/admin/settings/advanced.json trans.ja = public/language/ja/admin/settings/advanced.json trans.ko = public/language/ko/admin/settings/advanced.json trans.lt = public/language/lt/admin/settings/advanced.json +trans.lv = public/language/lv/admin/settings/advanced.json trans.ms = public/language/ms/admin/settings/advanced.json trans.nb = public/language/nb/admin/settings/advanced.json trans.nl = public/language/nl/admin/settings/advanced.json @@ -2624,6 +2677,7 @@ trans.it = public/language/it/admin/settings/cookies.json trans.ja = public/language/ja/admin/settings/cookies.json trans.ko = public/language/ko/admin/settings/cookies.json trans.lt = public/language/lt/admin/settings/cookies.json +trans.lv = public/language/lv/admin/settings/cookies.json trans.ms = public/language/ms/admin/settings/cookies.json trans.nb = public/language/nb/admin/settings/cookies.json trans.nl = public/language/nl/admin/settings/cookies.json @@ -2673,6 +2727,7 @@ trans.it = public/language/it/admin/settings/general.json trans.ja = public/language/ja/admin/settings/general.json trans.ko = public/language/ko/admin/settings/general.json trans.lt = public/language/lt/admin/settings/general.json +trans.lv = public/language/lv/admin/settings/general.json trans.ms = public/language/ms/admin/settings/general.json trans.nb = public/language/nb/admin/settings/general.json trans.nl = public/language/nl/admin/settings/general.json @@ -2722,6 +2777,7 @@ trans.it = public/language/it/admin/settings/guest.json trans.ja = public/language/ja/admin/settings/guest.json trans.ko = public/language/ko/admin/settings/guest.json trans.lt = public/language/lt/admin/settings/guest.json +trans.lv = public/language/lv/admin/settings/guest.json trans.ms = public/language/ms/admin/settings/guest.json trans.nb = public/language/nb/admin/settings/guest.json trans.nl = public/language/nl/admin/settings/guest.json @@ -2771,6 +2827,7 @@ trans.it = public/language/it/admin/settings/pagination.json trans.ja = public/language/ja/admin/settings/pagination.json trans.ko = public/language/ko/admin/settings/pagination.json trans.lt = public/language/lt/admin/settings/pagination.json +trans.lv = public/language/lv/admin/settings/pagination.json trans.ms = public/language/ms/admin/settings/pagination.json trans.nb = public/language/nb/admin/settings/pagination.json trans.nl = public/language/nl/admin/settings/pagination.json @@ -2820,6 +2877,7 @@ trans.it = public/language/it/admin/settings/reputation.json trans.ja = public/language/ja/admin/settings/reputation.json trans.ko = public/language/ko/admin/settings/reputation.json trans.lt = public/language/lt/admin/settings/reputation.json +trans.lv = public/language/lv/admin/settings/reputation.json trans.ms = public/language/ms/admin/settings/reputation.json trans.nb = public/language/nb/admin/settings/reputation.json trans.nl = public/language/nl/admin/settings/reputation.json @@ -2869,6 +2927,7 @@ trans.it = public/language/it/admin/settings/tags.json trans.ja = public/language/ja/admin/settings/tags.json trans.ko = public/language/ko/admin/settings/tags.json trans.lt = public/language/lt/admin/settings/tags.json +trans.lv = public/language/lv/admin/settings/tags.json trans.ms = public/language/ms/admin/settings/tags.json trans.nb = public/language/nb/admin/settings/tags.json trans.nl = public/language/nl/admin/settings/tags.json @@ -2918,6 +2977,7 @@ trans.it = public/language/it/admin/settings/user.json trans.ja = public/language/ja/admin/settings/user.json trans.ko = public/language/ko/admin/settings/user.json trans.lt = public/language/lt/admin/settings/user.json +trans.lv = public/language/lv/admin/settings/user.json trans.ms = public/language/ms/admin/settings/user.json trans.nb = public/language/nb/admin/settings/user.json trans.nl = public/language/nl/admin/settings/user.json @@ -2967,6 +3027,7 @@ trans.it = public/language/it/admin/settings/chat.json trans.ja = public/language/ja/admin/settings/chat.json trans.ko = public/language/ko/admin/settings/chat.json trans.lt = public/language/lt/admin/settings/chat.json +trans.lv = public/language/lv/admin/settings/chat.json trans.ms = public/language/ms/admin/settings/chat.json trans.nb = public/language/nb/admin/settings/chat.json trans.nl = public/language/nl/admin/settings/chat.json @@ -3016,6 +3077,7 @@ trans.it = public/language/it/admin/settings/email.json trans.ja = public/language/ja/admin/settings/email.json trans.ko = public/language/ko/admin/settings/email.json trans.lt = public/language/lt/admin/settings/email.json +trans.lv = public/language/lv/admin/settings/email.json trans.ms = public/language/ms/admin/settings/email.json trans.nb = public/language/nb/admin/settings/email.json trans.nl = public/language/nl/admin/settings/email.json @@ -3065,6 +3127,7 @@ trans.it = public/language/it/admin/settings/group.json trans.ja = public/language/ja/admin/settings/group.json trans.ko = public/language/ko/admin/settings/group.json trans.lt = public/language/lt/admin/settings/group.json +trans.lv = public/language/lv/admin/settings/group.json trans.ms = public/language/ms/admin/settings/group.json trans.nb = public/language/nb/admin/settings/group.json trans.nl = public/language/nl/admin/settings/group.json @@ -3114,6 +3177,7 @@ trans.it = public/language/it/admin/settings/notifications.json trans.ja = public/language/ja/admin/settings/notifications.json trans.ko = public/language/ko/admin/settings/notifications.json trans.lt = public/language/lt/admin/settings/notifications.json +trans.lv = public/language/lv/admin/settings/notifications.json trans.ms = public/language/ms/admin/settings/notifications.json trans.nb = public/language/nb/admin/settings/notifications.json trans.nl = public/language/nl/admin/settings/notifications.json @@ -3163,6 +3227,7 @@ trans.it = public/language/it/admin/settings/post.json trans.ja = public/language/ja/admin/settings/post.json trans.ko = public/language/ko/admin/settings/post.json trans.lt = public/language/lt/admin/settings/post.json +trans.lv = public/language/lv/admin/settings/post.json trans.ms = public/language/ms/admin/settings/post.json trans.nb = public/language/nb/admin/settings/post.json trans.nl = public/language/nl/admin/settings/post.json @@ -3212,6 +3277,7 @@ trans.it = public/language/it/admin/settings/sockets.json trans.ja = public/language/ja/admin/settings/sockets.json trans.ko = public/language/ko/admin/settings/sockets.json trans.lt = public/language/lt/admin/settings/sockets.json +trans.lv = public/language/lv/admin/settings/sockets.json trans.ms = public/language/ms/admin/settings/sockets.json trans.nb = public/language/nb/admin/settings/sockets.json trans.nl = public/language/nl/admin/settings/sockets.json @@ -3261,6 +3327,7 @@ trans.it = public/language/it/admin/settings/uploads.json trans.ja = public/language/ja/admin/settings/uploads.json trans.ko = public/language/ko/admin/settings/uploads.json trans.lt = public/language/lt/admin/settings/uploads.json +trans.lv = public/language/lv/admin/settings/uploads.json trans.ms = public/language/ms/admin/settings/uploads.json trans.nb = public/language/nb/admin/settings/uploads.json trans.nl = public/language/nl/admin/settings/uploads.json @@ -3310,6 +3377,7 @@ trans.it = public/language/it/admin/settings/web-crawler.json trans.ja = public/language/ja/admin/settings/web-crawler.json trans.ko = public/language/ko/admin/settings/web-crawler.json trans.lt = public/language/lt/admin/settings/web-crawler.json +trans.lv = public/language/lv/admin/settings/web-crawler.json trans.ms = public/language/ms/admin/settings/web-crawler.json trans.nb = public/language/nb/admin/settings/web-crawler.json trans.nl = public/language/nl/admin/settings/web-crawler.json diff --git a/public/language/lv/admin/admin.json b/public/language/lv/admin/admin.json new file mode 100644 index 0000000000..458101ea13 --- /dev/null +++ b/public/language/lv/admin/admin.json @@ -0,0 +1,7 @@ +{ + "alert.confirm-rebuild-and-restart": "Vai Tu tiešām vēlies pārkompilēt un tad pārstartēt NodeBB?", + "alert.confirm-restart": "Vai Tu tiešām vēlies pārstartēt NodeBB?", + + "acp-title": "%1 | NodeBB administrācijas vadības panelis", + "settings-header-contents": "Saturs" +} \ No newline at end of file diff --git a/public/language/lv/admin/advanced/cache.json b/public/language/lv/admin/advanced/cache.json new file mode 100644 index 0000000000..5a954f1232 --- /dev/null +++ b/public/language/lv/admin/advanced/cache.json @@ -0,0 +1,11 @@ +{ + "post-cache": "Post Cache", + "posts-in-cache": "Posts in Cache", + "average-post-size": "Average Post Size", + "length-to-max": "Length / 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" +} \ No newline at end of file diff --git a/public/language/lv/admin/advanced/database.json b/public/language/lv/admin/advanced/database.json new file mode 100644 index 0000000000..b5351b91e4 --- /dev/null +++ b/public/language/lv/admin/advanced/database.json @@ -0,0 +1,40 @@ +{ + "x-b": "%1 b", + "x-mb": "%1 mb", + "x-gb": "%1 gb", + "uptime-seconds": "Uptime in Seconds", + "uptime-days": "Uptime in Days", + + "mongo": "Mongo", + "mongo.version": "MongoDB Version", + "mongo.storage-engine": "Storage Engine", + "mongo.collections": "Collections", + "mongo.objects": "Objects", + "mongo.avg-object-size": "Avg. Object Size", + "mongo.data-size": "Data Size", + "mongo.storage-size": "Storage Size", + "mongo.index-size": "Index Size", + "mongo.file-size": "File Size", + "mongo.resident-memory": "Resident Memory", + "mongo.virtual-memory": "Virtual Memory", + "mongo.mapped-memory": "Mapped Memory", + "mongo.raw-info": "MongoDB Raw Info", + + "redis": "Redis", + "redis.version": "Redis Version", + "redis.connected-clients": "Connected Clients", + "redis.connected-slaves": "Connected Slaves", + "redis.blocked-clients": "Blocked Clients", + "redis.used-memory": "Used Memory", + "redis.memory-frag-ratio": "Memory Fragmentation Ratio", + "redis.total-connections-recieved": "Total Connections Received", + "redis.total-commands-processed": "Total Commands Processed", + "redis.iops": "Instantaneous Ops. Per Second", + "redis.keyspace-hits": "Keyspace Hits", + "redis.keyspace-misses": "Keyspace Misses", + "redis.raw-info": "Redis Raw Info", + + "postgres": "Postgres", + "postgres.version": "PostgreSQL Version", + "postgres.raw-info": "Postgres Raw Info" +} diff --git a/public/language/lv/admin/advanced/errors.json b/public/language/lv/admin/advanced/errors.json new file mode 100644 index 0000000000..546f0f1508 --- /dev/null +++ b/public/language/lv/admin/advanced/errors.json @@ -0,0 +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" +} \ No newline at end of file diff --git a/public/language/lv/admin/advanced/events.json b/public/language/lv/admin/advanced/events.json new file mode 100644 index 0000000000..766eb5e951 --- /dev/null +++ b/public/language/lv/admin/advanced/events.json @@ -0,0 +1,6 @@ +{ + "events": "Events", + "no-events": "There are no events", + "control-panel": "Events Control Panel", + "delete-events": "Delete Events" +} \ No newline at end of file diff --git a/public/language/lv/admin/advanced/logs.json b/public/language/lv/admin/advanced/logs.json new file mode 100644 index 0000000000..b9de400e1c --- /dev/null +++ b/public/language/lv/admin/advanced/logs.json @@ -0,0 +1,7 @@ +{ + "logs": "Logs", + "control-panel": "Logs Control Panel", + "reload": "Reload Logs", + "clear": "Clear Logs", + "clear-success": "Logs Cleared!" +} \ No newline at end of file diff --git a/public/language/lv/admin/appearance/customise.json b/public/language/lv/admin/appearance/customise.json new file mode 100644 index 0000000000..017fcbf984 --- /dev/null +++ b/public/language/lv/admin/appearance/customise.json @@ -0,0 +1,16 @@ +{ + "custom-css": "Custom CSS/LESS", + "custom-css.description": "Enter your own CSS/LESS declarations here, which will be applied after all other styles.", + "custom-css.enable": "Enable Custom CSS/LESS", + + "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-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-css.livereload": "Enable Live Reload", + "custom-css.livereload.description": "Iespējot šo, lai piespiestu visas tiešsaistes sesijas ikvienā no Tava konta esošajām ierīcēm atsvaidzināt katru reizi, kad noklikšķini uz Saglabāt" +} \ No newline at end of file diff --git a/public/language/lv/admin/appearance/skins.json b/public/language/lv/admin/appearance/skins.json new file mode 100644 index 0000000000..4db6fbdd8a --- /dev/null +++ b/public/language/lv/admin/appearance/skins.json @@ -0,0 +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" +} \ No newline at end of file diff --git a/public/language/lv/admin/appearance/themes.json b/public/language/lv/admin/appearance/themes.json new file mode 100644 index 0000000000..597830f379 --- /dev/null +++ b/public/language/lv/admin/appearance/themes.json @@ -0,0 +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 rebuild and restart your NodeBB to fully activate this theme." +} \ No newline at end of file diff --git a/public/language/lv/admin/development/info.json b/public/language/lv/admin/development/info.json new file mode 100644 index 0000000000..0a4ae6fe2c --- /dev/null +++ b/public/language/lv/admin/development/info.json @@ -0,0 +1,18 @@ +{ + "you-are-on": "Info - You are on %1:%2", + "nodes-responded": "%1 nodes responded within %2ms!", + "host": "host", + "pid": "pid", + "nodejs": "nodejs", + "online": "online", + "git": "git", + "memory": "memory", + "load": "load", + "uptime": "uptime", + + "registered": "Registered", + "sockets": "Sockets", + "guests": "Guests", + + "info": "Info" +} \ No newline at end of file diff --git a/public/language/lv/admin/development/logger.json b/public/language/lv/admin/development/logger.json new file mode 100644 index 0000000000..6ab9558149 --- /dev/null +++ b/public/language/lv/admin/development/logger.json @@ -0,0 +1,12 @@ +{ + "logger-settings": "Logger Settings", + "description": "By enabling the check boxes, you will receive logs to your terminal. If you specify a path, logs will then be saved to a file instead. HTTP logging is useful for collecting statistics about who, when, and what people access on your forum. In addition to logging HTTP requests, we can also log socket.io events. Socket.io logging, in combination with redis-cli monitor, can be very helpful for learning NodeBB's internals.", + "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", + "enable-http": "Enable HTTP logging", + "enable-socket": "Enable socket.io event logging", + "file-path": "Path to log file", + "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", + + "control-panel": "Logger Control Panel", + "update-settings": "Update Logger Settings" +} \ No newline at end of file diff --git a/public/language/lv/admin/extend/plugins.json b/public/language/lv/admin/extend/plugins.json new file mode 100644 index 0000000000..005d9044ae --- /dev/null +++ b/public/language/lv/admin/extend/plugins.json @@ -0,0 +1,53 @@ +{ + "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", + + "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.", + + "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", + + "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.", + + "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 rebuild and restart 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.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?

", + "alert.reorder": "Plugins Re-ordered", + "alert.reorder-success": "Please rebuild and restart your NodeBB to fully complete the process.", + + "license.title": "Plugin License Information", + "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?" +} diff --git a/public/language/lv/admin/extend/rewards.json b/public/language/lv/admin/extend/rewards.json new file mode 100644 index 0000000000..5383a90b33 --- /dev/null +++ b/public/language/lv/admin/extend/rewards.json @@ -0,0 +1,17 @@ +{ + "rewards": "Rewards", + "condition-if-users": "If User's", + "condition-is": "Is:", + "condition-then": "Then:", + "max-claims": "Amount of times reward is claimable", + "zero-infinite": "Enter 0 for infinite", + "delete": "Delete", + "enable": "Enable", + "disable": "Disable", + "control-panel": "Rewards Control", + "new-reward": "New Reward", + + "alert.delete-success": "Successfully deleted reward", + "alert.no-inputs-found": "Illegal reward - no inputs found!", + "alert.save-success": "Successfully saved rewards" +} \ No newline at end of file diff --git a/public/language/lv/admin/extend/widgets.json b/public/language/lv/admin/extend/widgets.json new file mode 100644 index 0000000000..025f48b327 --- /dev/null +++ b/public/language/lv/admin/extend/widgets.json @@ -0,0 +1,22 @@ +{ + "available": "Available Widgets", + "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", + "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", + "clone-from": "Clone widgets from", + "containers.available": "Available Containers", + "containers.explanation": "Drag and drop on top of any active widget", + "containers.none": "None", + "container.well": "Well", + "container.jumbotron": "Jumbotron", + "container.panel": "Panel", + "container.panel-header": "Panel Header", + "container.panel-body": "Panel Body", + "container.alert": "Alert", + + "alert.confirm-delete": "Are you sure you wish to delete this widget?", + "alert.updated": "Widgets Updated", + "alert.update-success": "Successfully updated widgets", + "alert.clone-success": "Successfully cloned widgets", + + "error.select-clone": "Please select a page to clone from" +} \ No newline at end of file diff --git a/public/language/lv/admin/general/dashboard.json b/public/language/lv/admin/general/dashboard.json new file mode 100644 index 0000000000..282b7409e8 --- /dev/null +++ b/public/language/lv/admin/general/dashboard.json @@ -0,0 +1,73 @@ +{ + "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", + + "stats.day": "Day", + "stats.week": "Week", + "stats.month": "Month", + "stats.all": "All Time", + + "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.", + "latest-lookup-failed": "

Failed to look up latest available version of NodeBB

", + + "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", + + "control-panel": "System Control", + "rebuild-and-restart": "Rebuild & Restart", + "restart": "Restart", + "restart-warning": "Rebuilding or Restarting your NodeBB will drop all existing connections for a few seconds.", + "restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.", + "maintenance-mode": "Maintenance Mode", + "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", + "realtime-chart-updates": "Realtime Chart Updates", + + "active-users": "Active Users", + "active-users.users": "Users", + "active-users.guests": "Guests", + "active-users.total": "Total", + "active-users.connections": "Connections", + + "anonymous-registered-users": "Anonymous vs Registered Users", + "anonymous": "Anonymous", + "registered": "Registered", + + "user-presence": "User Presence", + "on-categories": "On categories list", + "reading-posts": "Reading posts", + "browsing-topics": "Browsing topics", + "recent": "Recent", + "unread": "Unread", + + "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", + "last-restarted-by": "Last restarted by", + "no-users-browsing": "No users browsing" +} diff --git a/public/language/lv/admin/general/homepage.json b/public/language/lv/admin/general/homepage.json new file mode 100644 index 0000000000..7428d59eeb --- /dev/null +++ b/public/language/lv/admin/general/homepage.json @@ -0,0 +1,8 @@ +{ + "home-page": "Home Page", + "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", + "home-page-title": "Title of the home page (default \"Home\")" +} \ No newline at end of file diff --git a/public/language/lv/admin/general/languages.json b/public/language/lv/admin/general/languages.json new file mode 100644 index 0000000000..bdd57849b3 --- /dev/null +++ b/public/language/lv/admin/general/languages.json @@ -0,0 +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" +} \ No newline at end of file diff --git a/public/language/lv/admin/general/navigation.json b/public/language/lv/admin/general/navigation.json new file mode 100644 index 0000000000..a199668ae2 --- /dev/null +++ b/public/language/lv/admin/general/navigation.json @@ -0,0 +1,25 @@ +{ + "icon": "Icon:", + "change-icon": "change", + "route": "Route:", + "tooltip": "Tooltip:", + "text": "Text:", + "text-class": "Text Class: optional", + "id": "ID: optional", + + "properties": "Properties:", + "only-admins": "Only display to Admins", + "only-global-mods-and-admins": "Only display to Global Moderators and Admins", + "only-logged-in": "Only display to logged in users", + "only-guest": "Only display to guests", + "open-new-window": "Open in a new window", + + "btn.delete": "Delete", + "btn.disable": "Disable", + "btn.enable": "Enable", + + "available-menu-items": "Available Menu Items", + "custom-route": "Custom Route", + "core": "core", + "plugin": "plugin" +} \ No newline at end of file diff --git a/public/language/lv/admin/general/social.json b/public/language/lv/admin/general/social.json new file mode 100644 index 0000000000..23aedfcfaa --- /dev/null +++ b/public/language/lv/admin/general/social.json @@ -0,0 +1,5 @@ +{ + "post-sharing": "Post Sharing", + "info-plugins-additional": "Plugins can add additional networks for sharing posts.", + "save-success": "Successfully saved Post Sharing Networks!" +} \ No newline at end of file diff --git a/public/language/lv/admin/general/sounds.json b/public/language/lv/admin/general/sounds.json new file mode 100644 index 0000000000..0aca5337f8 --- /dev/null +++ b/public/language/lv/admin/general/sounds.json @@ -0,0 +1,9 @@ +{ + "notifications": "Notifications", + "chat-messages": "Sarunas", + "play-sound": "Play", + "incoming-message": "Incoming Message", + "outgoing-message": "Outgoing Message", + "upload-new-sound": "Upload New Sound", + "saved": "Iestatījumi saglabāti" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/admins-mods.json b/public/language/lv/admin/manage/admins-mods.json new file mode 100644 index 0000000000..e0f39ed5d4 --- /dev/null +++ b/public/language/lv/admin/manage/admins-mods.json @@ -0,0 +1,10 @@ +{ + "administrators": "Administrators", + "global-moderators": "Global Moderators", + "no-global-moderators": "No Global Moderators", + "moderators-of-category": "%1 Moderators", + "no-moderators": "No Moderators", + "add-administrator": "Add Administrator", + "add-global-moderator": "Add Global Moderator", + "add-moderator": "Add Moderator" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json new file mode 100644 index 0000000000..758785d689 --- /dev/null +++ b/public/language/lv/admin/manage/categories.json @@ -0,0 +1,72 @@ +{ + "settings": "Category Settings", + "privileges": "Privileges", + + "name": "Category Name", + "description": "Category Description", + "bg-color": "Background Colour", + "text-color": "Text Colour", + "bg-image-size": "Background Image Size", + "custom-class": "Custom Class", + "num-recent-replies": "# of Recent Replies", + "ext-link": "External Link", + "is-section": "Treat this category as a section", + "upload-image": "Upload Image", + "delete-image": "Remove", + "category-image": "Category Image", + "parent-category": "Parent Category", + "optional-parent-category": "(Optional) Parent Category", + "parent-category-none": "(None)", + "copy-settings": "Copy Settings From", + "optional-clone-settings": "(Optional) Clone Settings From Category", + "clone-children": "Clone Children Categories And Settings", + "purge": "Purge Category", + + "enable": "Enable", + "disable": "Disable", + "edit": "Edit", + + "select-category": "Select Category", + "set-parent-category": "Set Parent Category", + + "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. You can add a new user to this table by searching for them in the form below.", + "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", + "privileges.section-viewing": "Viewing Privileges", + "privileges.section-posting": "Posting Privileges", + "privileges.section-moderation": "Moderation Privileges", + "privileges.section-user": "User", + "privileges.search-user": "Add User", + "privileges.no-users": "No user-specific privileges in this category.", + "privileges.section-group": "Group", + "privileges.group-private": "This group is private", + "privileges.search-group": "Add Group", + "privileges.copy-to-children": "Copy to Children", + "privileges.copy-from-category": "Copy from Category", + "privileges.inherit": "If the registered-users group is granted a specific privilege, all other groups receive an implicit privilege, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the registered-users user group, and so, privileges for additional groups need not be explicitly granted.", + + "analytics.back": "Back to Categories List", + "analytics.title": "Analytics for \"%1\" category", + "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", + "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", + "analytics.topics-daily": "Figure 3 – Daily topics created in this category", + "analytics.posts-daily": "Figure 4 – Daily posts made in this category", + + "alert.created": "Created", + "alert.create-success": "Category successfully created!", + "alert.none-active": "You have no active categories.", + "alert.create": "Create a Category", + "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", + "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", + "alert.purge-success": "Category purged!", + "alert.copy-success": "Settings Copied!", + "alert.set-parent-category": "Set Parent Category", + "alert.updated": "Updated Categories", + "alert.updated-success": "Category IDs %1 successfully updated.", + "alert.upload-image": "Upload category image", + "alert.find-user": "Find a User", + "alert.user-search": "Search for a user here...", + "alert.find-group": "Find a Group", + "alert.group-search": "Search for a group here...", + "collapse-all": "Collapse All", + "expand-all": "Expand All" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/groups.json b/public/language/lv/admin/manage/groups.json new file mode 100644 index 0000000000..97a2b2d31b --- /dev/null +++ b/public/language/lv/admin/manage/groups.json @@ -0,0 +1,35 @@ +{ + "name": "Group Name", + "description": "Group Description", + "member-count": "Member Count", + "system": "System Group", + "edit": "Edit", + "search-placeholder": "Search", + "create": "Create Group", + "description-placeholder": "A short description about your group", + "create-button": "Create", + + "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", + "alerts.confirm-delete": "Are you sure you wish to delete this group?", + + "edit.name": "Name", + "edit.description": "Description", + "edit.user-title": "Title of Members", + "edit.icon": "Group Icon", + "edit.label-color": "Group Label Color", + "edit.show-badge": "Rādīt nozīmīti", + "edit.private-details": "If enabled, joining of groups requires approval from a group owner.", + "edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.", + "edit.disable-requests": "Disable join requests", + "edit.hidden": "Paslēpts", + "edit.hidden-details": "Ja ir iespējota, šī grupa nebūs redzama grupu sarakstā un lietotāji būs jāuzaicina pašrocīgi", + "edit.add-user": "Add User to Group", + "edit.add-user-search": "Search Users", + "edit.members": "Member List", + "control-panel": "Groups Control Panel", + "revert": "Revert", + + "edit.no-users-found": "No Users Found", + "edit.confirm-remove-user": "Are you sure you want to remove this user?", + "edit.save-success": "Izmaiņas saglabātas" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/ip-blacklist.json b/public/language/lv/admin/manage/ip-blacklist.json new file mode 100644 index 0000000000..588fbd62b6 --- /dev/null +++ b/public/language/lv/admin/manage/ip-blacklist.json @@ -0,0 +1,19 @@ +{ + "lead": "Configure your IP blacklist here.", + "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", + "active-rules": "Active Rules", + "validate": "Validate Blacklist", + "apply": "Apply Blacklist", + "hints": "Syntax Hints", + "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", + "hint-2": "You can add in comments by starting lines with the # symbol.", + + "validate.x-valid": "%1 out of %2 rule(s) valid.", + "validate.x-invalid": "The following %1 rules are invalid:", + + "alerts.applied-success": "Blacklist Applied", + + "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", + "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day", + "ip-banned": "IP banned" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/post-queue.json b/public/language/lv/admin/manage/post-queue.json new file mode 100644 index 0000000000..4de24c991b --- /dev/null +++ b/public/language/lv/admin/manage/post-queue.json @@ -0,0 +1,11 @@ +{ + "post-queue": "Post Queue", + "description": "There are no posts in the post queue.
To enable this feature, go to Settings → Post → Posting Restrictions and enable Post Queue.", + "user": "User", + "category": "Category", + "title": "Title", + "content": "Content", + "posted": "Posted", + "reply-to": "Reply to \"%1\"", + "content-editable": "You can click on individual content to edit before posting." +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/privileges.json b/public/language/lv/admin/manage/privileges.json new file mode 100644 index 0000000000..0de8ea489f --- /dev/null +++ b/public/language/lv/admin/manage/privileges.json @@ -0,0 +1,29 @@ +{ + "global": "Global", + "global.no-users": "No user-specific global privileges.", + + "chat": "Sarunāties", + "upload-images": "Upload Images", + "upload-files": "Upload Files", + "signature": "Signature", + "ban": "Ban", + "search-content": "Search Content", + "search-users": "Search Users", + "search-tags": "Search Tags", + + "find-category": "Find Category", + "access-category": "Access Category", + "access-topics": "Access Topics", + "create-topics": "Create Topics", + "reply-to-topics": "Reply to Topics", + "tag-topics": "Tag Topics", + "edit-posts": "Edit Posts", + "view-edit-history": "View Edit History", + "delete-posts": "Delete Posts", + "view_deleted": "View Deleted Posts", + "upvote-posts": "Ziņas, kurām ir balsis par", + "downvote-posts": "Downvote Posts", + "delete-topics": "Delete Topics", + "purge": "Purge", + "moderate": "Moderate" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/registration.json b/public/language/lv/admin/manage/registration.json new file mode 100644 index 0000000000..f9c7c84b59 --- /dev/null +++ b/public/language/lv/admin/manage/registration.json @@ -0,0 +1,20 @@ +{ + "queue": "Queue", + "description": "There are no users in the registration queue.
To enable this feature, go to Settings → User → User Registration and set Registration Type to \"Admin Approval\".", + + "list.name": "Name", + "list.email": "Email", + "list.ip": "IP", + "list.time": "Time", + "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", + "list.email-spam": "Frequency: %1 Appears: %2", + "list.ip-spam": "Frequency: %1 Appears: %2", + + "invitations": "Uzaicinājumi", + "invitations.description": "Below is a complete list of invitations sent. Use ctrl-f to search through the list by email or username.

The username will be displayed to the right of the emails for users who have redeemed their invitations.", + "invitations.inviter-username": "Lietotājs, kurš uzaicināja", + "invitations.invitee-email": "Lietotājs, kurš ir uzaicināts", + "invitations.invitee-username": "Lietotājs, kurš ir uzaicināts (ja ir reģistrēts)", + + "invitations.confirm-delete": "Vai tiešām vēlies dzēst šo uzaicinājumu?" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/tags.json b/public/language/lv/admin/manage/tags.json new file mode 100644 index 0000000000..df597a6166 --- /dev/null +++ b/public/language/lv/admin/manage/tags.json @@ -0,0 +1,19 @@ +{ + "none": "Your forum does not have any topics with tags yet.", + "bg-color": "Background Colour", + "text-color": "Text Colour", + "create-modify": "Create & Modify Tags", + "description": "Select tags via clicking and/or dragging, use shift to select multiple.", + "create": "Create Tag", + "modify": "Modify Tags", + "rename": "Rename Tags", + "delete": "Delete Selected Tags", + "search": "Search for tags...", + "settings": "Click here to visit the tag settings page.", + "name": "Tag Name", + + "alerts.editing-multiple": "Editing multiple tags", + "alerts.editing-x": "Editing \"%1\" tag", + "alerts.confirm-delete": "Do you want to delete the selected tags?", + "alerts.update-success": "Tag Updated!" +} \ No newline at end of file diff --git a/public/language/lv/admin/manage/users.json b/public/language/lv/admin/manage/users.json new file mode 100644 index 0000000000..cd07447923 --- /dev/null +++ b/public/language/lv/admin/manage/users.json @@ -0,0 +1,99 @@ +{ + "users": "Users", + "edit": "Edit", + "make-admin": "Make Admin", + "remove-admin": "Remove Admin", + "validate-email": "Validate Email", + "send-validation-email": "Send Validation Email", + "password-reset-email": "Send Password Reset Email", + "ban": "Ban User(s)", + "temp-ban": "Ban User(s) Temporarily", + "unban": "Unban User(s)", + "reset-lockout": "Reset Lockout", + "reset-flags": "Reset Flags", + "delete": "Delete User(s)", + "purge": "Delete User(s) and Content", + "download-csv": "Download CSV", + "invite": "Uzaicināt", + "new": "New User", + + "pills.latest": "Latest Users", + "pills.unvalidated": "Not Validated", + "pills.no-posts": "No Posts", + "pills.top-posters": "Top Posters", + "pills.top-rep": "Most Reputation", + "pills.inactive": "Inactive", + "pills.flagged": "Most Flagged", + "pills.banned": "Banned", + "pills.search": "User Search", + + "search.uid": "By User ID", + "search.uid-placeholder": "Enter a user ID to search", + "search.username": "By User Name", + "search.username-placeholder": "Enter a username to search", + "search.email": "By Email", + "search.email-placeholder": "Enter a email to search", + "search.ip": "By IP Address", + "search.ip-placeholder": "Enter an IP Address to search", + "search.not-found": "User not found!", + + "inactive.3-months": "3 months", + "inactive.6-months": "6 months", + "inactive.12-months": "12 months", + + "users.uid": "uid", + "users.username": "username", + "users.email": "email", + "users.postcount": "postcount", + "users.reputation": "reputation", + "users.flags": "flags", + "users.joined": "joined", + "users.last-online": "last online", + "users.banned": "banned", + + "create.username": "User Name", + "create.email": "Email", + "create.email-placeholder": "Email of this user", + "create.password": "Password", + "create.password-confirm": "Confirm Password", + + "temp-ban.length": "Ban Length", + "temp-ban.reason": "Reason (Optional)", + "temp-ban.hours": "Hours", + "temp-ban.days": "Days", + "temp-ban.explanation": "Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban.", + + "alerts.confirm-ban": "Do you really want to ban this user permanently?", + "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", + "alerts.ban-success": "User(s) banned!", + "alerts.button-ban-x": "Ban %1 user(s)", + "alerts.unban-success": "User(s) unbanned!", + "alerts.lockout-reset-success": "Lockout(s) reset!", + "alerts.flag-reset-success": "Flags(s) reset!", + "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", + "alerts.make-admin-success": "User is now administrator.", + "alerts.confirm-remove-admin": "Do you really want to remove this administrator?", + "alerts.remove-admin-success": "User is no longer administrator.", + "alerts.make-global-mod-success": "User is now global moderator.", + "alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?", + "alerts.remove-global-mod-success": "User is no longer global moderator.", + "alerts.make-moderator-success": "User is now moderator.", + "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", + "alerts.remove-moderator-success": "User is no longer moderator.", + "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", + "alerts.validate-email-success": "Emails validated", + "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", + "alerts.confirm-delete": "Warning!
Do you really want to delete user(s)?
This action is not reversable! Only the user account will be deleted, their posts and topics will remain.", + "alerts.delete-success": "User(s) Deleted!", + "alerts.confirm-purge": "Warning!
Do you really want to delete user(s) and their content?
This action is not reversable! All user data and content will be erased!", + "alerts.create": "Create User", + "alerts.button-create": "Create", + "alerts.button-cancel": "Cancel", + "alerts.error-passwords-different": "Passwords must match!", + "alerts.error-x": "Error

%1

", + "alerts.create-success": "User created!", + + "alerts.prompt-email": "Email: ", + "alerts.email-sent-to": "Uzaicinājuma e-pasta ir nosūtīts %1", + "alerts.x-users-found": "Atrasts %1 lietotājs(-i)! Meklēšana ilga 20 ms." +} \ No newline at end of file diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json new file mode 100644 index 0000000000..faf99f5ee5 --- /dev/null +++ b/public/language/lv/admin/menu.json @@ -0,0 +1,81 @@ +{ + "section-general": "General", + "general/dashboard": "Dashboard", + "general/homepage": "Home Page", + "general/navigation": "Navigation", + "general/languages": "Languages", + "general/sounds": "Sounds", + "general/social": "Social", + + "section-manage": "Manage", + "manage/categories": "Categories", + "manage/privileges": "Privileges", + "manage/tags": "Tags", + "manage/users": "Users", + "manage/admins-mods": "Admins & Mods", + "manage/registration": "Reģistrāciju rinda", + "manage/post-queue": "Post Queue", + "manage/groups": "Groups", + "manage/ip-blacklist": "IP Blacklist", + "manage/uploads": "Uploads", + + "section-settings": "Settings", + "settings/general": "General", + "settings/reputation": "Reputation", + "settings/email": "Email", + "settings/user": "User", + "settings/group": "Group", + "settings/guest": "Guests", + "settings/uploads": "Uploads", + "settings/post": "Post", + "settings/chat": "Sarunāties", + "settings/pagination": "Numerācija", + "settings/tags": "Tags", + "settings/notifications": "Notifications", + "settings/cookies": "Sīkfaili", + "settings/web-crawler": "Web Crawler", + "settings/sockets": "Sockets", + "settings/advanced": "Advanced", + + "settings.page-title": "%1 Settings", + + "section-appearance": "Appearance", + "appearance/themes": "Themes", + "appearance/skins": "Skins", + "appearance/customise": "Custom Content (HTML/JS/CSS)", + + "section-extend": "Extend", + "extend/plugins": "Plugins", + "extend/widgets": "Widgets", + "extend/rewards": "Rewards", + + "section-social-auth": "Social Authentication", + + "section-plugins": "Plugins", + "extend/plugins.install": "Install Plugins", + + "section-advanced": "Advanced", + "advanced/database": "Database", + "advanced/events": "Events", + "advanced/logs": "Logs", + "advanced/errors": "Errors", + "advanced/cache": "Cache", + "development/logger": "Logger", + "development/info": "Info", + + "rebuild-and-restart-forum": "Rebuild & Restart Forum", + "restart-forum": "Restart Forum", + "logout": "Log out", + "view-forum": "View Forum", + + "search.placeholder": "Search for settings", + "search.no-results": "No results...", + "search.search-forum": "Search the forum for ", + "search.keep-typing": "Type more to see results...", + "search.start-typing": "Start typing to see results...", + + "connection-lost": "Connection to %1 has been lost, attempting to reconnect...", + + "alerts.version": "Running NodeBB v%1", + "alerts.upgrade": "Upgrade to v%1" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/advanced.json b/public/language/lv/admin/settings/advanced.json new file mode 100644 index 0000000000..f989898d05 --- /dev/null +++ b/public/language/lv/admin/settings/advanced.json @@ -0,0 +1,27 @@ +{ + "maintenance-mode": "Maintenance Mode", + "maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.", + "maintenance-mode.message": "Maintenance Message", + "headers": "Headers", + "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", + "headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB", + "headers.acao": "Access-Control-Allow-Origin", + "headers.acao-regex": "Access-Control-Allow-Origin Regular Expression", + "headers.acao-help": "To deny access to all sites, leave empty", + "headers.acao-regex-help": "Enter regular expressions here to match dynamic origins. To deny access to all sites, leave empty", + "headers.acac": "Access-Control-Allow-Credentials", + "headers.acam": "Access-Control-Allow-Methods", + "headers.acah": "Access-Control-Allow-Headers", + "hsts": "Strict Transport Security", + "hsts.enabled": "Enabled HSTS (recommended)", + "hsts.subdomains": "Include subdomains in HSTS header", + "hsts.preload": "Allow preloading of HSTS header", + "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "traffic-management": "Traffic Management", + "traffic.help": "NodeBB deploys equipped with a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", + "traffic.enable": "Enable Traffic Management", + "traffic.event-lag": "Event Loop Lag Threshold (in milliseconds)", + "traffic.event-lag-help": "Lowering this value decreases wait times for page loads, but will also show the \"excessive load\" message to more users. (Restart required)", + "traffic.lag-check-interval": "Check Interval (in milliseconds)", + "traffic.lag-check-interval-help": "Lowering this value causes NodeBB to become more sensitive to spikes in load, but may also cause the check to become too sensitive. (Restart required)" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/chat.json b/public/language/lv/admin/settings/chat.json new file mode 100644 index 0000000000..05fe3db57d --- /dev/null +++ b/public/language/lv/admin/settings/chat.json @@ -0,0 +1,11 @@ +{ + "chat-settings": "Sarunu iestatījumi", + "disable": "Atspējot sarunāšanos", + "disable-editing": "Atspējot sarunu rediģēšanu/izdzēšanu", + "disable-editing-help": "Administrators and global moderators are exempt from this restriction", + "max-length": "Sarunu lielākais garums", + "max-room-size": "Maksimālais lietotāju skaits tērzētavā", + "delay": "Laiks starp sarunām milisekundēs", + "restrictions.seconds-edit-after": "Number of seconds before users are allowed to edit chat messages after posting. (0 disabled)", + "restrictions.seconds-delete-after": "Number of seconds before users are allowed to delete chat messages after posting. (0 disabled)" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/cookies.json b/public/language/lv/admin/settings/cookies.json new file mode 100644 index 0000000000..4b944d89d6 --- /dev/null +++ b/public/language/lv/admin/settings/cookies.json @@ -0,0 +1,11 @@ +{ + "eu-consent": "EU Consent", + "consent.enabled": "Enabled", + "consent.message": "Notification message", + "consent.acceptance": "Acceptance message", + "consent.link-text": "Policy Link Text", + "consent.blank-localised-default": "Leave blank to use NodeBB localised defaults", + "settings": "Settings", + "cookie-domain": "Tiešsaistes sesijas sīkfailu domēns", + "blank-default": "Leave blank for default" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/email.json b/public/language/lv/admin/settings/email.json new file mode 100644 index 0000000000..50ad2e06ea --- /dev/null +++ b/public/language/lv/admin/settings/email.json @@ -0,0 +1,37 @@ +{ + "email-settings": "Email Settings", + "address": "Email Address", + "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", + "from": "From Name", + "from-help": "The from name to display in the email.", + + "smtp-transport": "SMTP Transport", + "smtp-transport.enabled": "Use an external email server to send emails", + "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", + "smtp-transport.service": "Select a service", + "smtp-transport.service-custom": "Custom Service", + "smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.", + "smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", + "smtp-transport.gmail-warning2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", + "smtp-transport.host": "SMTP Host", + "smtp-transport.port": "SMTP Port", + "smtp-transport.security": "Connection security", + "smtp-transport.security-encrypted": "Encrypted", + "smtp-transport.security-starttls": "StartTLS", + "smtp-transport.security-none": "None", + "smtp-transport.username": "Username", + "smtp-transport.username-help": "For the Gmail service, enter the full email address here, especially if you are using a Google Apps managed domain.", + "smtp-transport.password": "Password", + + "template": "Edit Email Template", + "template.select": "Select Email Template", + "template.revert": "Revert to Original", + "testing": "Email Testing", + "testing.select": "Select Email Template", + "testing.send": "Send Test Email", + "testing.send-help": "The test email will be sent to the currently logged in user's email address.", + "subscriptions": "Email Subscriptions", + "subscriptions.disable": "Disable subscriber notification emails", + "subscriptions.hour": "Digest Hour", + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/general.json b/public/language/lv/admin/settings/general.json new file mode 100644 index 0000000000..948123f7cb --- /dev/null +++ b/public/language/lv/admin/settings/general.json @@ -0,0 +1,35 @@ +{ + "site-settings": "Site Settings", + "title": "Site Title", + "title.url": "URL", + "title.url-placeholder": "The URL of the site title", + "title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.", + "title.name": "Your Community Name", + "title.show-in-header": "Show Site Title in Header", + "browser-title": "Browser Title", + "browser-title-help": "If no browser title is specified, the site title will be used", + "title-layout": "Title Layout", + "title-layout-help": "Define how the browser title will be structured ie. {pageTitle} | {browserTitle}", + "description.placeholder": "A short description about your community", + "description": "Site Description", + "keywords": "Site Keywords", + "keywords-placeholder": "Keywords describing your community, comma-separated", + "logo": "Site Logo", + "logo.image": "Image", + "logo.image-placeholder": "Path to a logo to display on forum header", + "logo.upload": "Upload", + "logo.url": "URL", + "logo.url-placeholder": "The URL of the site logo", + "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", + "logo.alt-text": "Alt Text", + "log.alt-text-placeholder": "Alternative text for accessibility", + "favicon": "Favicon", + "favicon.upload": "Upload", + "touch-icon": "Homescreen/Touch Icon", + "touch-icon.upload": "Upload", + "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", + "outgoing-links": "Outgoing Links", + "outgoing-links.warning-page": "Use Outgoing Links Warning Page", + "search-default-sort-by": "Search default sort by", + "outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/group.json b/public/language/lv/admin/settings/group.json new file mode 100644 index 0000000000..fe3e39915b --- /dev/null +++ b/public/language/lv/admin/settings/group.json @@ -0,0 +1,13 @@ +{ + "general": "General", + "private-groups": "Private Groups", + "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", + "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", + "allow-creation": "Allow Group Creation", + "allow-creation-help": "If enabled, users can create groups (Default: disabled)", + "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", + "max-name-length": "Maximum Group Name Length", + "cover-image": "Group Cover Image", + "default-cover": "Default Cover Images", + "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/guest.json b/public/language/lv/admin/settings/guest.json new file mode 100644 index 0000000000..a8b9d458f0 --- /dev/null +++ b/public/language/lv/admin/settings/guest.json @@ -0,0 +1,5 @@ +{ + "handles": "Guest Handles", + "handles.enabled": "Allow guest handles", + "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/notifications.json b/public/language/lv/admin/settings/notifications.json new file mode 100644 index 0000000000..03fa0ac66a --- /dev/null +++ b/public/language/lv/admin/settings/notifications.json @@ -0,0 +1,7 @@ +{ + "notifications": "Notifications", + "welcome-notification": "Welcome Notification", + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)", + "notification-alert-timeout": "Notification Alert Timeout" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/pagination.json b/public/language/lv/admin/settings/pagination.json new file mode 100644 index 0000000000..fdfd92ee07 --- /dev/null +++ b/public/language/lv/admin/settings/pagination.json @@ -0,0 +1,10 @@ +{ + "pagination": "Numerācijas iestatījumi", + "enable": "Paginate topics and posts instead of using infinite scroll.", + "topics": "Tematu numerācija", + "posts-per-page": "Posts per Page", + "max-posts-per-page": "Maximum posts per page", + "categories": "Kategoriju numerācija", + "topics-per-page": "Topics per Page", + "max-topics-per-page": "Maximum topics per page" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/post.json b/public/language/lv/admin/settings/post.json new file mode 100644 index 0000000000..6594fe384b --- /dev/null +++ b/public/language/lv/admin/settings/post.json @@ -0,0 +1,54 @@ +{ + "sorting": "Post Sorting", + "sorting.post-default": "Default Post Sorting", + "sorting.oldest-to-newest": "Oldest to Newest", + "sorting.newest-to-oldest": "Newest to Oldest", + "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-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 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.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)", + "timestamp.cut-off-help": "Dates & times will be shown in a relative manner (e.g. \"3 hours ago\" / \"5 days ago\"), and localised into various\n\t\t\t\t\tlanguages. After a certain point, this text can be switched to display the localised date itself\n\t\t\t\t\t(e.g. 5 Nov 2016 15:30).
(Default: 30, or one month). Set to 0 to always display dates, leave blank to always display relative times.", + "teaser": "Teaser Post", + "teaser.last-post": "Last – Show the latest post, including the original post, if no replies", + "teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies", + "teaser.first": "First", + "unread": "Unread Settings", + "unread.cutoff": "Unread cutoff days", + "unread.min-track-last": "Minimum posts in topic before tracking last read", + "recent": "Recent Settings", + "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", + "signature": "Signature Settings", + "signature.disable": "Disable signatures", + "signature.no-links": "Disable links in signatures", + "signature.no-images": "Disable images in signatures", + "signature.max-length": "Maximum Signature Length", + "composer": "Composer Settings", + "composer-help": "The following settings govern the functionality and/or appearance of the post composer shown\n\t\t\t\tto users when they create new topics, or reply to existing topics.", + "composer.show-help": "Show \"Help\" tab", + "composer.enable-plugin-help": "Allow plugins to add content to the help tab", + "composer.custom-help": "Custom Help Text", + "ip-tracking": "IP Tracking", + "ip-tracking.each-post": "Track IP Address for each post", + "enable-post-history": "Enable Post History" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/reputation.json b/public/language/lv/admin/settings/reputation.json new file mode 100644 index 0000000000..910909ff65 --- /dev/null +++ b/public/language/lv/admin/settings/reputation.json @@ -0,0 +1,14 @@ +{ + "reputation": "Reputation Settings", + "disable": "Disable Reputation System", + "disable-down-voting": "Disable Down Voting", + "votes-are-public": "All Votes Are Public", + "thresholds": "Activity Thresholds", + "min-rep-downvote": "Minimum reputation to downvote posts", + "min-rep-flag": "Minimum reputation to flag posts", + "min-rep-website": "Minimum reputation to add \"Website\" to user profile", + "min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile", + "min-rep-signature": "Minimum reputation to add \"Signature\" to user profile", + "min-rep-profile-picture": "Minimum reputation to add \"Profile Picture\" to user profile", + "min-rep-cover-picture": "Minimum reputation to add \"Cover Picture\" to user profile" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/sockets.json b/public/language/lv/admin/settings/sockets.json new file mode 100644 index 0000000000..d04ee42fcf --- /dev/null +++ b/public/language/lv/admin/settings/sockets.json @@ -0,0 +1,6 @@ +{ + "reconnection": "Reconnection Settings", + "max-attempts": "Max Reconnection Attempts", + "default-placeholder": "Default: %1", + "delay": "Reconnection Delay" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/tags.json b/public/language/lv/admin/settings/tags.json new file mode 100644 index 0000000000..6f31f60ba0 --- /dev/null +++ b/public/language/lv/admin/settings/tags.json @@ -0,0 +1,12 @@ +{ + "tag": "Tag Settings", + "min-per-topic": "Minimum Tags per Topic", + "max-per-topic": "Maximum Tags per Topic", + "min-length": "Minimum Tag Length", + "max-length": "Maximum Tag Length", + "goto-manage": "Click here to visit the tag management page.", + "privacy": "Privacy", + "list-private": "Make the tags list private", + "related-topics": "Related Topics", + "max-related-topics": "Maximum related topics to display (if supported by theme)" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/uploads.json b/public/language/lv/admin/settings/uploads.json new file mode 100644 index 0000000000..e0382bd8da --- /dev/null +++ b/public/language/lv/admin/settings/uploads.json @@ -0,0 +1,32 @@ +{ + "posts": "Posts", + "allow-files": "Allow users to upload regular files", + "private": "Make uploaded files private", + "private-extensions": "File extensions to make private", + "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are 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)", + "resize-image-quality": "Quality to use when resizing images", + "resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.", + "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" +} diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json new file mode 100644 index 0000000000..c861e4fb50 --- /dev/null +++ b/public/language/lv/admin/settings/user.json @@ -0,0 +1,67 @@ +{ + "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": "Slēpt lietotāju sarakstu un datus no viesiem", + "hide-fullname": "Slēpt vārdu un uzvārdu no lietotājiem", + "hide-email": "Slēpt e-pasta adresi no lietotājiem", + "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": "Dienas, lai atcerētos lietotāju tiešsaistes sesijas", + "password-expiry-days": "Force password reset after a set number of days", + "registration": "Lietotāju reģistrācija", + "registration-type": "Reģistrācijas veids", + "registration-type.normal": "Normal", + "registration-type.admin-approval": "Admin Approval", + "registration-type.admin-approval-ip": "Admin Approval for IPs", + "registration-type.invite-only": "Tikai ar uzaicinājumu", + "registration-type.admin-invite-only": "Tikai ar administratora uzaicinājumu", + "registration-type.disabled": "Bez reģistrēšanas", + "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": "Maksimālais uzaicinājumu skaits vienam lietotājam\n", + "max-invites": "Maksimālais uzaicinājumu skaits vienam lietotājam", + "max-invites-help": "0 bez ierobežojuma. Administratori var uzaicināt bez gala.
Attiecas tikai uz \"tikai ar uzaicinājumu\"", + "invite-expiration": "Uzaicinājuma derīguma termiņš", + "invite-expiration-help": "Cik dienās beidzas uzaicinājumu derīguma termiņš.", + "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": "Rādīt e-pasta adresi", + "show-fullname": "Rādīt vārdu un uzvārdu", + "restrict-chat": "Atļaut sarunas tikai no tiem lietotājiem, kurus es sekoju", + "outgoing-new-tab": "Open outgoing links in new tab", + "topic-search": "Enable In-Topic Searching", + "digest-freq": "Subscribe to Digest", + "digest-freq.off": "Off", + "digest-freq.daily": "Daily", + "digest-freq.weekly": "Weekly", + "digest-freq.monthly": "Monthly", + "email-chat-notifs": "Sūtīt e-pastu, ja ierodas jauna saruna un es neesmu tiešsaistē", + "email-post-notif": "Send an email when replies are made to topics I am subscribed to", + "follow-created-topics": "Sekot tēmatiem, kurus Tu izveido", + "follow-replied-topics": "Sekot tēmatiem, uz kuriem Tu atbildi", + "default-notification-settings": "Default notification settings" +} \ No newline at end of file diff --git a/public/language/lv/admin/settings/web-crawler.json b/public/language/lv/admin/settings/web-crawler.json new file mode 100644 index 0000000000..2e0d31d12b --- /dev/null +++ b/public/language/lv/admin/settings/web-crawler.json @@ -0,0 +1,10 @@ +{ + "crawlability-settings": "Crawlability Settings", + "robots-txt": "Custom Robots.txt Leave blank for default", + "sitemap-feed-settings": "Sitemap & Feed Settings", + "disable-rss-feeds": "Disable RSS Feeds", + "disable-sitemap-xml": "Disable Sitemap.xml", + "sitemap-topics": "Number of Topics to display in the Sitemap", + "clear-sitemap-cache": "Clear Sitemap Cache", + "view-sitemap": "View Sitemap" +} \ No newline at end of file diff --git a/public/language/lv/category.json b/public/language/lv/category.json new file mode 100644 index 0000000000..9c32341096 --- /dev/null +++ b/public/language/lv/category.json @@ -0,0 +1,20 @@ +{ + "category": "Kategorija", + "subcategories": "Apakškategorijas", + "new_topic_button": "Jauns temats", + "guest-login-post": "Ielogojies lai rakstītu", + "no_topics": "Šinī kategorijā nav ziņu.
Vēlies rakstīt kādu ziņu?", + "browsing": "pārlūko", + "no_replies": "Nav atbilžu", + "no_new_posts": "Nav jaunu ziņu", + "share_this_category": "Dalīties ar šo kategoriju", + "watch": "Novērot", + "ignore": "Neievērot", + "watching": "Novēro", + "ignoring": "Neievēro", + "watching.description": "Rādīt neizlasitos tematus", + "ignoring.description": "Nerādīt neizlasitos tematus", + "watch.message": "Tu tagad novēro maiņas šinī kategorijā un visās apakškategorijās", + "ignore.message": "Tu tagad neievēro maiņas šinī kategorijā un visās apakškategorijās", + "watched-categories": "Novērotās kategorijas" +} \ No newline at end of file diff --git a/public/language/lv/email.json b/public/language/lv/email.json new file mode 100644 index 0000000000..6aa16f86f3 --- /dev/null +++ b/public/language/lv/email.json @@ -0,0 +1,44 @@ +{ + "password-reset-requested": "Paroles atiestatīšana pierakstīta - %1!", + "welcome-to": "Laipni lūgts %1", + "invite": "Uzaicinājums no %1", + "greeting_no_name": "Sveiki", + "greeting_with_name": "Sveiks %1", + "email.verify-your-email.subject": "Lūdzu, apstiprini savu e-pastu", + "email.verify.text1": "Tava e-pasta adrese ir mainījusies", + "welcome.text1": "Paldies, ka reģistrējies %1!", + "welcome.text2": "Lai pilnībā aktivizētu Tavu kontu, mums ir jāpārliecinās, ka Tev pieder e-pasta adrese, ar ko reģistrējies.", + "welcome.text3": "Administrators ir pieņēmis Tavu reģistrācijas pieteikumu. Tu tagad vari pieteikties ar savu lietotājvārdu un paroli.", + "welcome.cta": "Noklikšķini, lai apstiprinātu savu e-pasta adresi", + "invitation.text1": "%1 ir uzaicinājis Tevi pievienoties %2", + "invitation.text2": "Tavs uzaicinājums beigsies %1 dienu laikā.", + "invitation.ctr": "Noklikšķini, lai izveidotu savu kontu.", + "reset.text1": "Mēs saņēmām pieprasījumu atiestatīt Tavu paroli, iespējams, tāpēc, ka esi to aizmirsis. Ja tas tā nav, lūdzu, ignorē šo e-pastu.", + "reset.text2": "Lai turpinātu paroles atiestatīšanu, lūdzu, noklikšķini uz šīs saites:", + "reset.cta": "Noklikšķini, lai atiestatītu savu paroli", + "reset.notify.subject": "Parole veiksmīgi mainīta", + "reset.notify.text1": "Mēs Tevi informējam, ka %1 Tava parole tika veiksmīgi mainīta.", + "reset.notify.text2": "Ja neesi to pilnvarojis, nekavējoties informē administratoru par to.", + "digest.notifications": "Tev ir nelasīti paziņojumi no %1:", + "digest.latest_topics": "Jaunākie temati no %1", + "digest.cta": "Noklikšķini, lai apmeklētu %1", + "digest.unsub.info": "Šis kopsavilkums tika nosūtīts Tev Tavu abonēšanas iestatījumu dēļ.", + "digest.no_topics": "Nav bijis neviens aktīvs temats %1", + "digest.day": "diena", + "digest.week": "nedēļa", + "digest.month": "mēness", + "digest.subject": "Kopsavilkums par %1", + "notif.chat.subject": "Jauna saruna saņemta no %1", + "notif.chat.cta": "Noklikšķini, lai turpinātu sarunu", + "notif.chat.unsub.info": "Šis sarunas paziņojums tika Tev nosūtīts Tavu abonēšanas iestatījumu dēļ.", + "notif.post.cta": "Noklikšķini, lai izlasītu visu tematu", + "notif.post.unsub.info": "Šis ziņas paziņojums tika nosūtīts Tev Tavu abonēšanas iestatījumu dēļ.", + "notif.cta": "Noklikšķini, lai dotos uz forumu", + "test.text1": "Šis ir e-pasts, lai pārbaudītu, vai e-pasta sūtītājs ir pareizi iestatīts Tavā NodeBB.", + "unsub.cta": "Noklikšķini, lai mainītu šos iestatījumus", + "banned.subject": "Tev ir aizliegts %1", + "banned.text1": "Lietotājs %1 ir aizliegts no %2.", + "banned.text2": "Aizliegums ilgs līdz %1.", + "banned.text3": "Šis ir iemesls, kāpēc Tu esi aizliegts:", + "closing": "Paldies!" +} \ No newline at end of file diff --git a/public/language/lv/error.json b/public/language/lv/error.json new file mode 100644 index 0000000000..bf7ef7a22e --- /dev/null +++ b/public/language/lv/error.json @@ -0,0 +1,156 @@ +{ + "invalid-data": "Nederīgi dati", + "invalid-json": "Nederīgs JSON", + "not-logged-in": "Šķiet, ka neesi pieteicies.", + "account-locked": "Jūsu konts ir uz laiku bloķēts", + "search-requires-login": "Meklēšanai nepieciešams konts - lūdzu, piesakies vai reģistrējies.", + "goback": "Nospiedi atpakaļ, lai atgrieztos iepriekšējā lapā", + "invalid-cid": "Nederīgs kategorijas ID", + "invalid-tid": "Nederīgs temata ID", + "invalid-pid": "Nederīgs ziņas ID", + "invalid-uid": "Nederīgs lietotāja ID", + "invalid-username": "Nederīgs lietotājvārds", + "invalid-email": "Nederīga e-pasta adrese", + "invalid-title": "Nederīgs virsraksts", + "invalid-user-data": "Nederīgi lietotāja dati", + "invalid-password": "Nederīga parole", + "invalid-login-credentials": "Nederīgi pieteikšanās dati", + "invalid-username-or-password": "Lūdzu, norādi gan lietotājvārdu, gan paroli", + "invalid-search-term": "Nederīga meklēšanas frāze", + "invalid-url": "Nederīgs URL\n", + "local-login-disabled": "Pieteikšanās sistēma ir atspējota nepriviliģētiem kontiem.", + "csrf-invalid": "Mēs nevarējām Tevi pierakstīt, iespējams, beigušās tiešsaistes sesijas dēļ. Lūdzu, mēģini vēlreiz", + "invalid-pagination-value": "Nederīga numerācijas vērtība, ir jābūt vismaz %1 un ne vairāk kā %2", + "username-taken": "Lietotājvārds jau izmantots", + "email-taken": "E-pasta adrese jau izmantota", + "email-not-confirmed": "Tava e-pasta adrese vēl nav apstiprināta, lūdzu, noklikšķini, lai apstiprinātu savu e-pasta adresi.", + "email-not-confirmed-chat": "Tu nevari sarunāties, kamēr Tava e-pasta adrese netiek apstiprināta, lūdzu, noklikšķini, lai apstiprinātu savu e-pasta adresi.", + "email-not-confirmed-email-sent": "Tava e-pasta adrese vēl nav apstiprināta, lūdzu, pārbaudi ienākušos e-pastus apstiprinājuma e-pastam.", + "no-email-to-confirm": "Šis forums prasa e-pasta apstiprinājumu, lūdzu, noklikšķini, lai ievadītu e-pasta adresi", + "email-confirm-failed": "Mēs nevarējām apstiprināt Tavu e-pasta adresi, lūdzu, vēlāk mēģiniet vēlreiz.", + "confirm-email-already-sent": "Apstiprinājuma e-pasts ir jau nosūtīts, lūdzu, uzgaidiet %1 minūtes, lai nosūtītu vēl vienu.", + "sendmail-not-found": "Sendmail programmu nevarēja atrast, lūdzu, pārliecinies, ka lietotājs, kas darbojas ar NodeBB, ir to instalējis un izdarījis palaižamu.", + "username-too-short": "Pārāk īss lietotājvārds", + "username-too-long": "Pārāk garš lietotājvārds", + "password-too-long": "Pārāk gara parole", + "user-banned": "Lietotājs ir bloķēts", + "user-banned-reason": "Diemžēl šis konts ir bloķēts (Iemesls: %1)", + "user-banned-reason-until": "Diemžēl šis konts ir bloķēts līdz %1 (Iemesls: %2)", + "user-too-new": "Atvaino, pirms pirmās ziņas izveides Tev jāgaida %1 sekundes", + "blacklisted-ip": "Diemžēl Tava IP adrese ir bloķēta šajā kopienā. Ja Tev liekas, ka esam kļūdījušies, lūdzu, sazinies ar administratoru.", + "ban-expiry-missing": "Lūdzu, norādi šā aizlieguma beigu datumu", + "no-category": "Kategorija nav atrasta", + "no-topic": "Temats nav atrasts", + "no-post": "Ziņa nav atrasta", + "no-group": "Grupa nav atrasta", + "no-user": "Lietotājs nav atrasts", + "no-teaser": "Ievadapraksts nav atrasts", + "no-privileges": "Tev nepietiek tiesības šai darbībai.", + "category-disabled": "Kategorija ir atspējota", + "topic-locked": "Temats ir slēgts", + "post-edit-duration-expired": "Tev ir atļauts rediģēt ziņas tikai līdz %1 sekundēm pēc publicēšanas", + "post-edit-duration-expired-minutes": "Tev ir atļauts rediģēt ziņas tikai līdz %1 minūtēm pēc publicēšanas", + "post-edit-duration-expired-minutes-seconds": "Tev ir atļauts rediģēt ziņas tikai līdz %1 minūtēm un %2 sekundēm pēc publicēšanas", + "post-edit-duration-expired-hours": "Tev ir atļauts rediģēt ziņas tikai līdz %1 stundām pēc publicēšanas", + "post-edit-duration-expired-hours-minutes": "Tev ir atļauts rediģēt ziņas tikai līdz %1 stundām un %2 minūtēm pēc publicēšanas", + "post-edit-duration-expired-days": "Tev ir atļauts rediģēt ziņas tikai līdz %1 dienām pēc publicēšanas", + "post-edit-duration-expired-days-hours": "Tev ir atļauts rediģēt ziņas tikai līdz %1 dienām un %2 stundām pēc publicēšanas", + "post-delete-duration-expired": "Pēc publicēšanas Tev ir atļauts tikai %1 sekundes laika izdzēst ziņas", + "post-delete-duration-expired-minutes": "Pēc publicēšanas Tev ir atļauts tikai %1 minūtes laika izdzēst ziņas", + "post-delete-duration-expired-minutes-seconds": "Pēc publicēšanas Tev ir atļauts tikai %1 minūtes un %2 sekundes laika izdzēst ziņas", + "post-delete-duration-expired-hours": "Pēc publicēšanas Tev ir atļauts tikai %1 stundas laika izdzēst ziņas", + "post-delete-duration-expired-hours-minutes": "Pēc publicēšanas Tev ir atļauts tikai %1 stundas un %2 minūtes laika izdzēst ziņas", + "post-delete-duration-expired-days": "Pēc publicēšanas Tev ir atļauts tikai %1 dienas laika izdzēst ziņas", + "post-delete-duration-expired-days-hours": "Pēc publicēšanas Tev ir atļauts tikai %1 dienas un %2 stundas laika izdzēst ziņas", + "cant-delete-topic-has-reply": "Tu nevari izdzēst savu tematu pēc tam, kad tam ir atbilde", + "cant-delete-topic-has-replies": "Tu nevari izdzēst savu tematu pēc tam, kad tam ir %1 atbildes", + "content-too-short": "Lūdzu, ievadiet garāku ziņu. Ziņā jāsatur vismaz %1 rakstzīmes.", + "content-too-long": "Lūdzu, ievadiet īsāku ziņu. Ziņā nevar būt vairāk kā %1 rakstzīmes.", + "title-too-short": "Lūdzu, ievadiet garāku virsrakstu. Virsrakstā jāsatur vismaz %1 rakstzīmes.", + "title-too-long": "Lūdzu, ievadiet īsāku virsrakstu. Virsrakstā nevar būt vairāk kā %1 rakstzīmes.", + "category-not-selected": "Kategorija nav atlasīta.", + "too-many-posts": "Tu vari ievietot tikai vienu ziņu katras %1 sekundes - lūdzu, uzgaidi, pirms ievieto vēlreiz", + "too-many-posts-newbie": "Kā jauns lietotājs Tu vari ievietot tikai vienu ziņu katras %1 sekundes, līdz esat nopelnījis %2 ranga punktus - lūdzu, uzgaidi, pirms ievieto vēlreiz", + "tag-too-short": "Lūdzu, ievadiet garāku birku. Birkā jāsatur vismaz %1 rakstzīmes.", + "tag-too-long": "Lūdzu, ievadiet īsāku birku. Birkā nevar būt vairāk kā %1 rakstzīmes.", + "not-enough-tags": "Nav pietiekami daudz birku. Tematiem jābūt vismaz %1 birkām", + "too-many-tags": "Pārāk daudz birku. Tematiem nevar būt vairāk kā %1 birkas", + "still-uploading": "Lūdzu, uzgaidi, līdz augšupielādes beidzas.", + "file-too-big": "Lielākais atļauto faila lielums ir %1 kB - lūdzu, augšupielādē mazāku failu", + "guest-upload-disabled": "Viesu failu augšupielāde ir atspējota", + "cors-error": "Unable to upload image due to misconfigured CORS", + "already-bookmarked": "Tu jau esi atzīmējis šo ziņu ar grāmatzīmi", + "already-unbookmarked": "Tu jau esi noņēmis grāmatzīmi no šīs ziņas", + "cant-ban-other-admins": "Tu nevari bloķēt citus administratorus!", + "cant-remove-last-admin": "Tu esi vienīgais administrators. Pievieno vēl vienu lietotāju kā administratoru, pirms noņemi sevi kā administratoru", + "cant-delete-admin": "Noņemi administratora tiesības no šī konta, pirms mēģināt to izdzēst.", + "invalid-image": "Nederīgs attēls", + "invalid-image-type": "Nederīgs attēla veids. Atļautie veidi ir: %1", + "invalid-image-extension": "Nederīgs attēla paplašinājums", + "invalid-file-type": "Nederīgs faila veids. Atļautie veidi ir: %1", + "group-name-too-short": "Grupas nosaukums ir pārāk īss", + "group-name-too-long": "Grupas nosaukums ir pārāk garš", + "group-already-exists": "Grupa jau pastāv", + "group-name-change-not-allowed": "Grupas nosaukuma maiņa nav atļauta", + "group-already-member": "Jau ir šīs grupas biedrs", + "group-not-member": "Nav šīs grupas biedrs", + "group-needs-owner": "Šai grupai ir nepieciešams vismaz viens īpašnieks", + "group-already-invited": "Šis lietotājs jau ir uzaicināts", + "group-already-requested": "Tavs biedru pieteikums jau ir iesniegts", + "post-already-deleted": "Šī ziņa jau ir izdzēsta", + "post-already-restored": "Šī ziņa jau ir atjaunota", + "topic-already-deleted": "Šis temats jau ir izdzēsts", + "topic-already-restored": "Šis temats jau ir atjaunots", + "cant-purge-main-post": "Tu nevari iztīrīt galveno ziņu, lūdzu, tā vietā izdzēsi tematu", + "topic-thumbnails-are-disabled": "Tematu sīktēli ir atspējoti.", + "invalid-file": "Nederīgs fails", + "uploads-are-disabled": "Augšupielāde ir atspējota", + "signature-too-long": "Atvaino, Tavā parakstā nevar būt vairāk kā %1 rakstzīmes.", + "about-me-too-long": "Atvaino, Tavā 'par mani' rakstā nevar būt vairāk kā %1 rakstzīmes.", + "cant-chat-with-yourself": "Tu nevari sarunāties pats ar sevi!", + "chat-restricted": "Šis lietotājs ir ierobežojis savas sarunas. Viņam ir Tev jāseko, pirms vari sarunāties ar viņu", + "chat-disabled": "Sarunu sistēma ir atspējota", + "too-many-messages": "Tu esi publicējis pārāk daudz ziņu, lūdzu, kādu laiku uzgaidi.", + "invalid-chat-message": "Nederīga saruna", + "chat-message-too-long": "Sarunā nevar būt vairāk kā %1 rakstzīmes.", + "cant-edit-chat-message": "Tev nav atļauts rediģēt šo ziņu", + "cant-remove-last-user": "Tu nevari izdzēst pēdējo lietotāju", + "cant-delete-chat-message": "Tev nav atļauts izdzēst šo ziņu", + "chat-edit-duration-expired": "Pēc publicēšanas Tev ir atļauts tikai %1 sekundes laika rediģēt sarunu", + "chat-delete-duration-expired": "Pēc publicēšanas Tev ir atļauts tikai %1 sekundes laika izdzēst sarunu", + "chat-deleted-already": "Saruna jau ir izdzēsta.", + "chat-restored'already": "Saruna jau ir atjaunota.", + "already-voting-for-this-post": "Tu jau balsoji par šo ziņu.", + "reputation-system-disabled": "Reputācijas sistēma ir atspējota.", + "downvoting-disabled": "Balsošana pret ir atspējota", + "not-enough-reputation-to-downvote": "Tev nepietiek ranga punktu, lai balsotu pret šo ziņu", + "not-enough-reputation-to-flag": "Tev nepietiek ranga punktu, lai paziņot par šo ziņu", + "not-enough-reputation-min-rep-website": "Tev nepietiek ranga punktu, lai pievienot mājas lapu", + "not-enough-reputation-min-rep-aboutme": "Tev nepietiek ranga punktu, lai pievienot 'par mani' rakstu", + "not-enough-reputation-min-rep-signature": "Tev nepietiek ranga punktu, lai pievienot parakstu", + "not-enough-reputation-min-rep-profile-picture": "Tev nepietiek ranga punktu, lai pievienot profila bildi", + "not-enough-reputation-min-rep-cover-picture": "Tev nepietiek ranga punktu, lai pievienot vāka bildi", + "already-flagged": "Tu jau paziņoji par šo ziņu", + "self-vote": "Tu nevari balsot pats par savu ziņu", + "reload-failed": "NodeBB radās problēma pārlādēšanas laikā: \"%1\". NodeBB turpinās apkalpot esošos klienta puses failus, lai gan Tev būtu jāatceļ tas, ko Tu veici tieši pirms pārlādēšanas.", + "registration-error": "Kļūda pie reģistrācijas", + "parse-error": "Radās kļūda parsējot servera atbildi", + "wrong-login-type-email": "Lūdzu, izmanto savu e-pasta adresi, lai pieteiktos", + "wrong-login-type-username": "Lūdzu, izmanto savu lietotājvārdu, lai pieteiktos", + "sso-registration-disabled": "Reģistrācija ir atspējota %1 kontos, lūdzu, vispirms reģistrējies ar e-pasta adresi", + "sso-multiple-association": "Tu nevari saistīt vairākus kontus no šī pakalpojuma savā NodeBB kontā. Lūdzu, nošķiri savu esošo kontu un mēģini vēlreiz.", + "invite-maximum-met": "Tu esi uzaicinājis maksimālo cilvēku skaitu (%1 no %2).", + "no-session-found": "Tiešsaistes sesiju nevarēja atrast!", + "not-in-room": "Lietotājs nav istabā", + "no-users-in-room": "Šajā istabā nav lietotāju", + "cant-kick-self": "Tu nevari sevi izslēgt no grupas", + "no-users-selected": "Nav atlasīts neviens lietotājs(-i)", + "invalid-home-page-route": "Nederīgs sākumlapas URL", + "invalid-session": "Tiešsaistes sesijas nesakrīt", + "invalid-session-text": "Izskatās, ka Tava tiešsaistes sesija vairs nav aktīva vai vairs nesakrīt ar serveri. Lūdzu, atsvaidzini šo lapu.", + "no-topics-selected": "Nav atlasīts neviens temats", + "cant-move-to-same-topic": "Nevar pārnest uz pašu tematu!", + "cannot-block-self": "Tu nevari pats sevi bloķēt!", + "cannot-block-privileged": "Tu nevari bloķēt administratorus vai globālos moderatorus", + "no-connection": "Šķiet, ka pastāv problēma ar Tavu interneta pieslēgumu" +} \ No newline at end of file diff --git a/public/language/lv/flags.json b/public/language/lv/flags.json new file mode 100644 index 0000000000..2994d862e7 --- /dev/null +++ b/public/language/lv/flags.json @@ -0,0 +1,65 @@ +{ + "state": "Stāvoklis", + "reporter": "Ziņotājs", + "reported-at": "Ziņots", + "description": "Apraksts", + "no-flags": "Labi! Nav atzīmju.", + "assignee": "Piešķirtais", + "update": "Atjaunot", + "updated": "Atjaunots", + "target-purged": "Saturs, uz kā attiecas atzīme, ir iztīrīts un vairs nav pieejams.", + + "quick-filters": "Ātrie filtri", + "filter-active": "Šajā atzīmju sarakstā ir aktīvs viens vai vairāki filtri", + "filter-reset": "Noņemt filtrus", + "filters": "Filtrēšanas opcijas", + "filter-reporterId": "Ziņotāja UID", + "filter-targetUid": "Atzīmētās ziņas UID", + "filter-type": "Atzīmes veids", + "filter-type-all": "Viss saturs", + "filter-type-post": "Ziņa", + "filter-type-user": "Lietotājs", + "filter-state": "Stāvoklis", + "filter-assignee": "Piešķirtā UID", + "filter-cid": "Kategorija", + "filter-quick-mine": "Piešķirts man", + "filter-cid-all": "Visas kategorijas", + "apply-filters": "Lietot filtrus", + + "quick-links": "Ātrās saites", + "flagged-user": "Atzīmētais lietotājs", + "view-profile": "Skatīt profilu", + "start-new-chat": "Sākt jaunu sarunu", + "go-to-target": "Skatīt atzīmēto ziņu", + + "user-view": "Skatīt profilu", + "user-edit": "Rediģēt profilu", + + "notes": "Atzīmju piezīmes", + "add-note": "Pievienot piezīmi", + "no-notes": "Nav kopīgu piezīmju.", + + "history": "Atzīmju vēsture", + "back": "Atpakaļ uz atzīmju sarakstu", + "no-history": "Nav atzīmju vēsture.", + + "state-all": "Visi stāvokļi", + "state-open": "Sākt jaunu/atvērt", + "state-wip": "Darbība iesākta", + "state-resolved": "Atrisināts", + "state-rejected": "Noraidīts", + "no-assignee": "Nav piešķirts", + "note-added": "Piezīme pievienota", + + "modal-title": "Ziņot par nepiemērotu saturu", + "modal-body": "Lūdzu, norādi iemeslu, kāpēc %1 %2 ir atzīmēts pārskatīšanai. Citādi, izmanto vienu no ātrā ziņojuma pogām.", + "modal-reason-spam": "Mēstule", + "modal-reason-offensive": "Aizskarošs", + "modal-reason-other": "Cits (norādīt zemāk)", + "modal-reason-custom": "Iemesls, kāpēc ziņots par saturu...", + "modal-submit": "Iesniegt ziņojumu", + "modal-submit-success": "Saturs ir atzīmēts moderēšanai.", + "modal-submit-confirm": "Apstiprināt iesniegšanu", + "modal-submit-confirm-text": "Tu jau atzīmei norādīji pielāgotu iemeslu. Vai tiešām vēlies iesniegt ātro ziņojumu?", + "modal-submit-confirm-text-help": "Iesniedzot ātro ziņojumu, tiks pārrakstīti visi pielāgoti iemesli." +} \ No newline at end of file diff --git a/public/language/lv/global.json b/public/language/lv/global.json new file mode 100644 index 0000000000..7161b9826a --- /dev/null +++ b/public/language/lv/global.json @@ -0,0 +1,113 @@ +{ + "home": "Mājas", + "search": "Meklēt", + "buttons.close": "Aizvērt", + "403.title": "Piekļuve liegta", + "403.message": "Šķiet, ka esi uznācis uz lapu, kurai Tev nav piekļuves.", + "403.login": "Varbūt Tev vajadzētu mēģināt pierakstīties?", + "404.title": "Nav atrasts", + "404.message": "Šķiet, ka esi uznācis uz lapu, kura neeksistē. Atgriezies mājaslapā.", + "500.title": "Iekšēja kļūda.", + "500.message": "Hmm... Izskatās, ka kaut kas noticis nepareizi!", + "400.title": "Nepareizs pieprasījums.", + "400.message": "Šķiet, ka šī saite ir nepareiza, lūdzu, pārbaudi un mēģini vēlreiz. Pretējā gadījumā atgriezies mājaslapā.", + "register": "Reģistrēties", + "login": "Pieteikties", + "please_log_in": "Lūdzu, pieteikties", + "logout": "Izlogoties", + "posting_restriction_info": "Pašlaik publicēšana pieejama tikai reģistrētiem biedriem, lai pieteiktos, noklikšķini šeit.", + "welcome_back": "Laipni lūdzam atpakaļ", + "you_have_successfully_logged_in": "Tu esi veiksmīgi pieteicies", + "save_changes": "Saglabāt izmaiņas", + "save": "Saglabāt", + "close": "Aizvērt", + "pagination": "Numerācija", + "pagination.out_of": "%1 no %2", + "pagination.enter_index": "Ievadīt numuru", + "header.admin": "Administrācija", + "header.categories": "Kategorijas", + "header.recent": "Nesenie", + "header.unread": "Nelasītie", + "header.tags": "Birkas", + "header.popular": "Ieredzētie", + "header.users": "Lietotāji", + "header.groups": "Grupas", + "header.chats": "Sarunas", + "header.notifications": "Paziņojumi", + "header.search": "Meklēt", + "header.profile": "Profils", + "header.navigation": "Navigācija", + "notifications.loading": "Ielādē paziņojumus", + "chats.loading": "Ielādē sarunas", + "motd.welcome": "Laipni lūdzam NodeBB, nākotnes diskusiju platformā.", + "previouspage": "Iepriekšējā lapa", + "nextpage": "Nākamā lapa", + "alert.success": "Veiksme", + "alert.error": "Kļūda", + "alert.banned": "Aizliegts", + "alert.banned.message": "Tu tikko esi bijis aizliegts, Tu tagad izrakstīsies.", + "alert.unfollow": "Tu vairs neseko %1!", + "alert.follow": "Tu tagad seko %1!", + "online": "Tiešsaistē", + "users": "Lietotāji", + "topics": "Temati", + "posts": "Ziņas", + "best": "Labākie", + "votes": "Balsis", + "upvoters": "Balsoja par", + "upvoted": "Balsoja par", + "downvoters": "Balsoja pret", + "downvoted": "Balsoja pret", + "views": "Skatieni", + "reputation": "Ranga punkti", + "read_more": "lasīt vairāk", + "more": "Vairāk", + "posted_ago_by_guest": "Viesis ziņoja %1", + "posted_ago_by": "%2 ziņoja %1", + "posted_ago": "ziņoja %1", + "posted_in": "ziņoja kategorijā %1", + "posted_in_by": "%2 ziņoja kategorijā %1", + "posted_in_ago": "ziņoja kategorijā %1 %2", + "posted_in_ago_by": "%3 ziņoja kategorijā %1 %2", + "user_posted_ago": "%1 ziņoja %2", + "guest_posted_ago": "Viesis ziņoja %1", + "last_edited_by": "pēdējoreiz rediģējis %1", + "norecentposts": "Nav nesenu ziņu", + "norecenttopics": "Nav nesenu tematu", + "recentposts": "Nesenās ziņas", + "recentips": "Nesen ielogotās IP adreses", + "moderator_tools": "Moderatora rīki", + "away": "Prom", + "dnd": "Netraucēt", + "invisible": "Neredzams", + "offline": "Bezsaistē", + "email": "E-pasta adrese", + "language": "Valoda", + "guest": "Viesis", + "guests": "Viesi", + "former_user": "A Former User", + "updated.title": "Forums ir atjaunināts", + "updated.message": "Forums tikko tika atjaunināts līdz jaunākajai versijai. Noklikšķini šeit, lai atsvaidzinātu lapu.", + "privacy": "Privātums", + "follow": "Sekot", + "unfollow": "Nesekot", + "delete_all": "Izdzēst visus", + "map": "Karte", + "sessions": "Tiešsaistes sesijas", + "ip_address": "IP adrese", + "enter_page_number": "Ievadi lapas numuru", + "upload_file": "Augšupielādēt failu", + "upload": "Augšupielādēt", + "uploads": "Augšupielādes", + "allowed-file-types": "Atļautie failu veidi ir %1", + "unsaved-changes": "Tev ir nesaglabātas izmaiņas. Vai tiešām vēlies doties prom?", + "reconnecting-message": "Šķiet, ka Tavs savienojums ar %1 tika pazaudēts, lūdzu, uzgaidi, kamēr mēģinām atkal pievienoties.", + "play": "Spēlēt", + "cookies.message": "Šī vietne izmanto sīkfailus, lai nodrošinātu, ka Tu iegūsti vislabāko pieredzi mūsu vietnē.", + "cookies.accept": "Sapratu!", + "cookies.learn_more": "Uzzināt vairāk", + "edited": "Rediģētie", + "disabled": "Atspējotie", + "select": "Atlasīt", + "user-search-prompt": "Ieraksti kaut ko šeit, lai meklētu lietotājus..." +} \ No newline at end of file diff --git a/public/language/lv/groups.json b/public/language/lv/groups.json new file mode 100644 index 0000000000..b4ea187562 --- /dev/null +++ b/public/language/lv/groups.json @@ -0,0 +1,59 @@ +{ + "groups": "Grupas", + "view_group": "Skatīt grupas", + "owner": "Grupas īpašnieks", + "new_group": "Izveidot jaunu grupu", + "no_groups_found": "Nav grupu, ko redzēt", + "pending.accept": "Pieņemt", + "pending.reject": "Noraidīt", + "pending.accept_all": "Pieņemt visus", + "pending.reject_all": "Atraidīt visus", + "pending.none": "Šobrīd nav neviena neapstiprināta biedra", + "invited.none": "Šobrīd nav neviena uzaicināta biedra", + "invited.uninvite": "Atsaukt uzaicinājumu", + "invited.search": "Meklēt lietotājus, kurus aicināt šinī grupā", + "invited.notification_title": "Tu esi uzaicināts pievienoties %1", + "request.notification_title": "Grupas dalības pieprasījums no %1", + "request.notification_text": "%1 ir pieprasījis kļūt par %2 dalībnieku", + "cover-save": "Saglabāt", + "cover-saving": "Tiek saglabāts", + "details.title": "Grupas informācija", + "details.members": "Biedru saraksts", + "details.pending": "Neapstiprinātie biedri", + "details.invited": "Uzaicinātie biedri", + "details.has_no_posts": "Šīs grupas biedri nav publicējuši nevienu ziņu.", + "details.latest_posts": "Pēdējās ziņas", + "details.private": "Slēgts", + "details.disableJoinRequests": "Atspējot dalībnieka pieprasījumus", + "details.grant": "Piešķirt/atsaukt īpašumtiesības", + "details.kick": "Izslēgt", + "details.kick_confirm": "Vai tiešām vēlies izslēgt šo biedru no grupas?", + "details.add-member": "Pievienot biedru", + "details.owner_options": "Grupu administrācija", + "details.group_name": "Grupas nosaukums", + "details.member_count": "Biedru skaits", + "details.creation_date": "Izveidošanas datums", + "details.description": "Apraksts", + "details.badge_preview": "Nozīmītes priekšskats", + "details.change_icon": "Mainīt ikonu", + "details.change_colour": "Mainīt krāsu", + "details.badge_text": "Nozīmītes teksts", + "details.userTitleEnabled": "Rādīt nozīmīti", + "details.private_help": "Ja ir iespējota, pievienoties grupai nepieciešama grupas īpašnieka apstiprināšana", + "details.hidden": "Paslēpts", + "details.hidden_help": "Ja ir iespējota, šī grupa nebūs redzama grupu sarakstā un lietotāji būs jāuzaicina pašrocīgi", + "details.delete_group": "Izdzēst grupu", + "details.private_system_help": "Privātās grupas ir atspējotas sistēmas līmenī, šī opcija nedara neko", + "event.updated": "Grupas informācija ir atjaunināta", + "event.deleted": "Grupa %1 ir izdzēsta", + "membership.accept-invitation": "Pieņemt ielūgumu", + "membership.invitation-pending": "Neapstiprināts uzaicinājums", + "membership.join-group": "Pievienoties grupai", + "membership.leave-group": "Atstāt grupu", + "membership.reject": "Noraidīt", + "new-group.group_name": "Grupas nosaukums", + "upload-group-cover": "Augšupielādēt grupas vāka bildi", + "bulk-invite-instructions": "Ievadi sarakstu ar lietotājvārdiem, atdalītajiem ar komatu, kurus uzaicināt uz šo grupu", + "bulk-invite": "Lielapjoma uzaicinājums", + "remove_group_cover_confirm": "Vai tiešām vēlies noņemt vāka bildi?" +} \ No newline at end of file diff --git a/public/language/lv/language.json b/public/language/lv/language.json new file mode 100644 index 0000000000..205fc313b8 --- /dev/null +++ b/public/language/lv/language.json @@ -0,0 +1,5 @@ +{ + "name": "latviešu", + "code": "lv", + "dir": "ltr" +} \ No newline at end of file diff --git a/public/language/lv/login.json b/public/language/lv/login.json new file mode 100644 index 0000000000..795c60a163 --- /dev/null +++ b/public/language/lv/login.json @@ -0,0 +1,12 @@ +{ + "username-email": "Lietotājvārds / parole", + "username": "Lietotājvārds", + "email": "E-pasta adrese", + "remember_me": "Atcerēties mani?", + "forgot_password": "Aizmirsi paroli?", + "alternative_logins": "Alternatīvie lietotājvārdi", + "failed_login_attempt": "Tev pieteikties neveiksmējās", + "login_successful": "Tu esi veiksmīgi pieteicies!", + "dont_have_account": "Vai Tev nav konta?", + "logged-out-due-to-inactivity": "Neaktivitātes dēļ Tu esi izrakstīts no administrācijas vadības paneļa" +} \ No newline at end of file diff --git a/public/language/lv/modules.json b/public/language/lv/modules.json new file mode 100644 index 0000000000..897011fe95 --- /dev/null +++ b/public/language/lv/modules.json @@ -0,0 +1,62 @@ +{ + "chat.chatting_with": "Sarunāties ar", + "chat.placeholder": "Šeit ieraksti sarunu, nospiedi enter, lai nosūtītu", + "chat.send": "Nosūtīt", + "chat.no_active": "Nav aktīvu sarunu.", + "chat.user_typing": "%1 raksta...", + "chat.user_has_messaged_you": "%1 ir Tev nosūtījis sarunu", + "chat.see_all": "Skatīt visas sarunas", + "chat.mark_all_read": "Atzīmēt visas sarunas kā lasītas", + "chat.no-messages": "Lūdzu, izvēlies adresātu, lai skatītu sarunu vēsturi", + "chat.no-users-in-room": "Šajā tērzētavā nav lietotāju", + "chat.recent-chats": "Nesenās sarunas", + "chat.contacts": "Kontaktpersonas", + "chat.message-history": "Sarunu vēsture", + "chat.options": "Sarunu iestatījumi", + "chat.pop-out": "Uznirstošā saruna", + "chat.minimize": "Minimizēt", + "chat.maximize": "Maksimizēt", + "chat.seven_days": "7 dienas", + "chat.thirty_days": "30 dienas", + "chat.three_months": "3 mēneši", + "chat.delete_message_confirm": "Vai tiešām vēlies izdzēst šo sarunu?", + "chat.retrieving-users": "Ielādē lietotājus...", + "chat.manage-room": "Administrēt tērzētavu", + "chat.add-user-help": "Meklē lietotājus šeit. Izvēlētais lietotājs tiks pievienots sarunai. Jaunais lietotājs neredzēs sarunas, kas rakstītas pirms viņu pievienoja sarunai. Tikai tērzētavas īpašnieks(-i) var noņemt lietotājus no tērzētavām.", + "chat.confirm-chat-with-dnd-user": "Lietotājs ir iestatījis savu statusu uz DnD (netraucēt). Vai Tu joprojām vēlies sarunāties ar viņu?", + "chat.rename-room": "Pārdēvēt tērzētavu", + "chat.rename-placeholder": "Ievadi savas tērzētavas nosaukumu šeit", + "chat.rename-help": "Šeit norādītais tērzētavas nosaukums būs redzams visiem dalībniekiem.", + "chat.leave": "Pamest sarunu", + "chat.leave-prompt": "Vai tiešām vēlies pamest šo sarunu?", + "chat.leave-help": "Atstājot šo sarunu, Tu tiksi noņemts no turpmākām sarunām. Ja Tu atkārtoti pievienojies nākotnē, Tu neredzēsi nevienu sarunu no pirms tā brīža.", + "chat.in-room": "Šajā tērzētavā", + "chat.kick": "Izslēgt", + "chat.show-ip": "Rādīt IP adresi", + "chat.owner": "Tērzētavas īpašnieks", + "composer.compose": "Sastādīt", + "composer.show_preview": "Rādīt priekšskatu", + "composer.hide_preview": "Slēpt priekšskatu", + "composer.user_said_in": "%1 sacīja %2:", + "composer.user_said": "%1 sacīja:", + "composer.discard": "Vai tiešām vēlies atmest šo ziņu?", + "composer.submit_and_lock": "Iesniegt un aizslēgt", + "composer.toggle_dropdown": "Pārslēgt izvēlni", + "composer.uploading": "Augšupielādē %1", + "composer.formatting.bold": "Treknrakstā", + "composer.formatting.italic": "Slīprakstā", + "composer.formatting.list": "Saraksts", + "composer.formatting.strikethrough": "Svītrots", + "composer.formatting.link": "Saite", + "composer.formatting.picture": "Bilde", + "composer.upload-picture": "Augšupielādēt bildi", + "composer.upload-file": "Augšupielādēt failu", + "composer.zen_mode": "Zen režīms", + "composer.select_category": "Izvēlēties kategoriju", + "bootbox.ok": "Labi", + "bootbox.cancel": "Atcelt", + "bootbox.confirm": "Apstiprināt", + "cover.dragging_title": "Novietot vāka bildi", + "cover.dragging_message": "Velc vāka bildi vēlamajā vietā un noklikšķini uz Saglabāt.\n", + "cover.saved": "Vāka bilde un vieta saglabāta" +} \ No newline at end of file diff --git a/public/language/lv/notifications.json b/public/language/lv/notifications.json new file mode 100644 index 0000000000..81a7c86789 --- /dev/null +++ b/public/language/lv/notifications.json @@ -0,0 +1,64 @@ +{ + "title": "Paziņojumi", + "no_notifs": "Tev nav jaunu paziņojumu", + "see_all": "Skatīt visus paziņojumus", + "mark_all_read": "Atzīmēt visus paziņojumus kā lasītus", + "back_to_home": "Atpakaļ uz %1", + "outgoing_link": "Izejošā saite", + "outgoing_link_message": "Tu tagad atstāj %1", + "continue_to": "Turpināt uz %1", + "return_to": "Atgriezties pie %1", + "new_notification": "Jauns paziņojums", + "new_notification_from": "Tev ir jauns paziņojums no %1", + "you_have_unread_notifications": "Tev ir nelasīti paziņojumi", + "all": "Visi", + "topics": "Temati", + "replies": "Atbildes", + "chat": "Sarunas", + "follows": "Tas, ko sekoju", + "upvote": "Balsis par", + "new-flags": "Jaunās atzīmes", + "my-flags": "Atzīmes piešķirtas man", + "bans": "Aizliegumi", + "new_message_from": "Jauna ziņa no %1", + "upvoted_your_post_in": "%1 ir balsojis par Tavu ziņu %2.", + "upvoted_your_post_in_dual": "%1 un %2 ir balsojuši par Tavu ziņu %3.", + "upvoted_your_post_in_multiple": "%1 un %2 citi ir balsojuši par Tavu ziņu %3.", + "moved_your_post": "%1 ir pārvietojis Tavu ziņu %2", + "moved_your_topic": "%1 ir pārvietojis %2", + "user_flagged_post_in": "%1 ir atzīmējis ziņu %2", + "user_flagged_post_in_dual": "%1 un %2 ir atzīmējuši ziņu %3", + "user_flagged_post_in_multiple": "%1 un %2 citi ir atzīmējuši ziņu %3", + "user_flagged_user": "%1 ir atzīmējis lietotāja profilu (%2)", + "user_flagged_user_dual": "%1 un %2 ir atzīmējuši lietotāja profilu (%3)", + "user_flagged_user_multiple": "%1 un %2 citi ir atzīmējuši lietotāja profilu (%3)", + "user_posted_to": "%1 ir atbildējis %2", + "user_posted_to_dual": "%1 un %2 ir atbildējuši %3", + "user_posted_to_multiple": "%1 un %2 citi ir atbildējuši %3", + "user_posted_topic": "%1 ir ievietojis jaunu tematu: %2", + "user_started_following_you": "%1 sāka Tev sekot.", + "user_started_following_you_dual": "%1 un %2 sāka Tev sekot.", + "user_started_following_you_multiple": "%1 un %2 citi sāka Tev sekot.", + "new_register": "%1 sūtīja reģistrācijas pieteikumu.", + "new_register_multiple": "Ir %1 reģistrācijas pietiekumi, kas jāpārskata.", + "flag_assigned_to_you": "Atzīme %1 ir piešķirta Tev", + "post_awaiting_review": "Ziņa, kas jāpārskata", + "email-confirmed": "E-pasta adrese ir apstiprināta", + "email-confirmed-message": "Paldies, ka apstiprināji e-pasta adresi. Tavs konts tagad ir pilnībā aktivizēts.", + "email-confirm-error-message": "Tavā e-pasta adreses apstiprināšanā radās problēma. Iespējams, kods ir nederīgs vai ir beidzies derīguma termiņš.", + "email-confirm-sent": "Apstiprinājuma e-pasts ir nosūtīts.", + "none": "Nekāds", + "notification_only": "Tikai kā paziņojums", + "email_only": "Tikai pa e-pastu", + "notification_and_email": "Kā paziņojums un pa e-pastu", + "notificationType_upvote": "Kad kāds balso par Tavu ziņu", + "notificationType_new-topic": "Kad kāds, kuru Tu seko, publicē ziņu", + "notificationType_new-reply": "Kad jauna atbilde tiek pievienota tematam, kuru vēro", + "notificationType_follow": "Kad kāds sāk Tev sekot", + "notificationType_new-chat": "Kad saņemi sarunu", + "notificationType_group-invite": "Kad saņemi grupas uzaicinājumu", + "notificationType_new-register": "Kad kāds tiek pievienots reģistrāciju rindai", + "notificationType_post-queue": "Kad jauna ziņa tiek pievienot rindai", + "notificationType_new-post-flag": "Kad ziņa tiek atzīmēta", + "notificationType_new-user-flag": "Kad lietotājs tiek atzīmēts" +} \ No newline at end of file diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json new file mode 100644 index 0000000000..311413bd2a --- /dev/null +++ b/public/language/lv/pages.json @@ -0,0 +1,61 @@ +{ + "home": "Home", + "unread": "Unread Topics", + "popular-day": "Popular topics today", + "popular-week": "Popular topics this week", + "popular-month": "Popular topics this month", + "popular-alltime": "All time popular topics", + "recent": "Recent Topics", + "top-day": "Top voted topics today", + "top-week": "Top voted topics this week", + "top-month": "Top voted topics this month", + "top-alltime": "Top Voted Topics", + "moderator-tools": "Moderator Tools", + "flagged-content": "Flagged Content", + "ip-blacklist": "IP Blacklist", + "post-queue": "Post Queue", + "users/online": "Online Users", + "users/latest": "Latest Users", + "users/sort-posts": "Users with the most posts", + "users/sort-reputation": "Users with the most reputation", + "users/banned": "Banned Users", + "users/most-flags": "Most flagged users", + "users/search": "User Search", + "notifications": "Notifications", + "tags": "Tags", + "tag": "Topics tagged under "%1"", + "register": "Register an account", + "registration-complete": "Reģistrācija ir pabeigta", + "login": "Login to your account", + "reset": "Reset your account password", + "categories": "Categories", + "groups": "Groups", + "group": "%1 group", + "chats": "Sarunas", + "chat": "Sarunājās ar %1", + "flags": "Flags", + "flag-details": "Flag %1 Details", + "account/edit": "Editing \"%1\"", + "account/edit/password": "Editing password of \"%1\"", + "account/edit/username": "Editing username of \"%1\"", + "account/edit/email": "Editing email of \"%1\"", + "account/info": "Account Info", + "account/following": "Tie, kuri %1 seko", + "account/followers": "Tie, kuri seko %1", + "account/posts": "Posts made by %1", + "account/topics": "Topics created by %1", + "account/groups": "%1's Groups", + "account/bookmarks": "%1 ziņas atzīmētas ar grāmatzīmi", + "account/settings": "User Settings", + "account/watched": "Topics watched by %1", + "account/ignored": "Topics ignored by %1", + "account/upvoted": "Ziņas, kurām %1 balsoja par", + "account/downvoted": "Posts downvoted by %1", + "account/best": "Best posts made by %1", + "account/blocks": "Blocked users for %1", + "account/uploads": "Uploads by %1", + "confirm": "Email Confirmed", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administrator has left this message:", + "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." +} \ No newline at end of file diff --git a/public/language/lv/recent.json b/public/language/lv/recent.json new file mode 100644 index 0000000000..f993a65464 --- /dev/null +++ b/public/language/lv/recent.json @@ -0,0 +1,19 @@ +{ + "title": "Recent", + "day": "Day", + "week": "Week", + "month": "Month", + "year": "Year", + "alltime": "All Time", + "no_recent_topics": "There are no recent topics.", + "no_popular_topics": "There are no popular topics.", + "there-is-a-new-topic": "Ir jauns temats.", + "there-is-a-new-topic-and-a-new-post": "Ir jauns temats un jauna ziņa.", + "there-is-a-new-topic-and-new-posts": "Ir jauns temats un %1 jaunas ziņas.", + "there-are-new-topics": "Ir %1 jaunas ziņas.", + "there-are-new-topics-and-a-new-post": "Ir %1 jauni temati un jauna ziņa.", + "there-are-new-topics-and-new-posts": "Ir %1 jauni temati un %2 jaunas ziņas.", + "there-is-a-new-post": "There is a new post.", + "there-are-new-posts": "There are %1 new posts.", + "click-here-to-reload": "Click here to reload." +} \ No newline at end of file diff --git a/public/language/lv/register.json b/public/language/lv/register.json new file mode 100644 index 0000000000..4b7f90412f --- /dev/null +++ b/public/language/lv/register.json @@ -0,0 +1,26 @@ +{ + "register": "Register", + "cancel_registration": "Atcelt reģistrācijas pieteikumu", + "help.email": "Pēc noklusējuma Tava e-pasta adrese nebūs redzama ārpus NodeBB.", + "help.username_restrictions": "A unique username between %1 and %2 characters. Others can mention you with @username.", + "help.minimum_password_length": "Your password's length must be at least %1 characters.", + "email_address": "Email Address", + "email_address_placeholder": "Enter Email Address", + "username": "Username", + "username_placeholder": "Enter Username", + "password": "Password", + "password_placeholder": "Enter Password", + "confirm_password": "Confirm Password", + "confirm_password_placeholder": "Confirm Password", + "register_now_button": "Register Now", + "alternative_registration": "Alternatīva reģistrācija", + "terms_of_use": "Terms of Use", + "agree_to_terms_of_use": "I agree to the Terms of Use", + "terms_of_use_error": "You must agree to the Terms of Use", + "registration-added-to-queue": "Tavs reģistrācijas pieteikums ir pievienots apstiprināšanas rindai. Tu saņemsi e-pastu, kad to pieņems administrators.", + "interstitial.intro": "We require some additional information before we can create your account.", + "interstitial.errors-found": "Mēs nevarējām pabeigt jūsu reģistrāciju:", + "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", + "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", + "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." +} \ No newline at end of file diff --git a/public/language/lv/reset_password.json b/public/language/lv/reset_password.json new file mode 100644 index 0000000000..26ce208d0d --- /dev/null +++ b/public/language/lv/reset_password.json @@ -0,0 +1,17 @@ +{ + "reset_password": "Reset Password", + "update_password": "Update Password", + "password_changed.title": "Password Changed", + "password_changed.message": "

Password successfully reset, please log in again.", + "wrong_reset_code.title": "Incorrect Reset Code", + "wrong_reset_code.message": "The reset code received was incorrect. Please try again, or request a new reset code.", + "new_password": "New Password", + "repeat_password": "Confirm Password", + "enter_email": "Please enter your email address and we will send you an email with instructions on how to reset your account.", + "enter_email_address": "Enter Email Address", + "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "invalid_email": "Invalid Email / Email does not exist!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" +} \ No newline at end of file diff --git a/public/language/lv/search.json b/public/language/lv/search.json new file mode 100644 index 0000000000..cbb2fb4bfc --- /dev/null +++ b/public/language/lv/search.json @@ -0,0 +1,45 @@ +{ + "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", + "no-matches": "No matches found", + "advanced-search": "Advanced Search", + "in": "In", + "titles": "Titles", + "titles-posts": "Titles and Posts", + "match-words": "Match words", + "all": "All", + "any": "Any", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "has-tags": "Has tags", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "relevance": "Relevance", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order", + "save-preferences": "Saglabāt preferences", + "clear-preferences": "Clear preferences", + "search-preferences-saved": "Meklēšanas preferences saglabātas", + "search-preferences-cleared": "Search preferences cleared", + "show-results-as": "Show results as" +} \ No newline at end of file diff --git a/public/language/lv/success.json b/public/language/lv/success.json new file mode 100644 index 0000000000..73094d2888 --- /dev/null +++ b/public/language/lv/success.json @@ -0,0 +1,7 @@ +{ + "success": "Success", + "topic-post": "You have successfully posted.", + "post-queued": "Your post is queued for approval.", + "authentication-successful": "Authentication Successful", + "settings-saved": "Iestatījumi saglabāti!" +} \ No newline at end of file diff --git a/public/language/lv/tags.json b/public/language/lv/tags.json new file mode 100644 index 0000000000..c416d8d4ec --- /dev/null +++ b/public/language/lv/tags.json @@ -0,0 +1,7 @@ +{ + "no_tag_topics": "There are no topics with this tag.", + "tags": "Tags", + "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here_short": "Enter tags...", + "no_tags": "There are no tags yet." +} \ No newline at end of file diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json new file mode 100644 index 0000000000..a4c915556e --- /dev/null +++ b/public/language/lv/topic.json @@ -0,0 +1,133 @@ +{ + "topic": "Topic", + "topic_id": "Topic ID", + "topic_id_placeholder": "Enter topic ID", + "no_topics_found": "No topics found!", + "no_posts_found": "No posts found!", + "post_is_deleted": "This post is deleted!", + "topic_is_deleted": "This topic is deleted!", + "profile": "Profile", + "posted_by": "Posted by %1", + "posted_by_guest": "Posted by Guest", + "chat": "Sarunāties", + "notify_me": "Tiec informēts par jaunām atbildēm šajā tematā", + "quote": "Quote", + "reply": "Reply", + "replies_to_this_post": "%1 Replies", + "one_reply_to_this_post": "1 Reply", + "last_reply_time": "Last reply", + "reply-as-topic": "Reply as topic", + "guest-login-reply": "Log in to reply", + "edit": "Edit", + "delete": "Delete", + "purge": "Purge", + "restore": "Restore", + "move": "Move", + "fork": "Fork", + "link": "Link", + "share": "Share", + "tools": "Tools", + "locked": "Locked", + "pinned": "Pinned", + "moved": "Moved", + "copy-ip": "Copy IP", + "ban-ip": "Ban IP", + "view-history": "Edit History", + "bookmark_instructions": "Click here to return to the last read post in this thread.", + "flag_title": "Flag this post for moderation", + "merged_message": "This topic has been merged into %2", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", + "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", + "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", + "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", + "markAsUnreadForAll.success": "Temats visiem atzīmēts kā nelasīts", + "mark_unread": "Atzīmēt kā nelasītu", + "mark_unread.success": "Temats atzīmēts kā nelasīts", + "watch": "Watch", + "unwatch": "Unwatch", + "watch.title": "Tiec informēts par jaunām atbildēm šajā tematā", + "unwatch.title": "Stop watching this topic", + "share_this_post": "Share this Post", + "watching": "Watching", + "not-watching": "Not Watching", + "ignoring": "Ignoring", + "watching.description": "Notify me of new replies.
Show topic in unread.", + "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", + "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", + "thread_tools.title": "Topic Tools", + "thread_tools.markAsUnreadForAll": "Visiem atzīmēt kā nelasītu", + "thread_tools.pin": "Pin Topic", + "thread_tools.unpin": "Unpin Topic", + "thread_tools.lock": "Lock Topic", + "thread_tools.unlock": "Unlock Topic", + "thread_tools.move": "Move Topic", + "thread_tools.move-posts": "Move Posts", + "thread_tools.move_all": "Move All", + "thread_tools.select_category": "Select Category", + "thread_tools.fork": "Fork Topic", + "thread_tools.delete": "Delete Topic", + "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", + "thread_tools.restore": "Restore Topic", + "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?", + "post_purge_confirm": "Are you sure you want to purge this post?", + "load_categories": "Loading Categories", + "confirm_move": "Move", + "confirm_fork": "Fork", + "bookmark": "Grāmatzīme", + "bookmarks": "Grāmatzīmes", + "bookmarks.has_no_bookmarks": "Tu vēl neesi nevienu ziņu atzīmējis ar grāmatzīmi.", + "loading_more_posts": "Loading More Posts", + "move_topic": "Move Topic", + "move_topics": "Move Topics", + "move_post": "Move Post", + "post_moved": "Post moved!", + "fork_topic": "Fork Topic", + "fork_topic_instruction": "Click the posts you want to fork", + "fork_no_pids": "No posts selected!", + "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", + "move_posts_instruction": "Click the posts you want to move", + "composer.title_placeholder": "Enter your topic title here...", + "composer.handle_placeholder": "Name", + "composer.discard": "Discard", + "composer.submit": "Submit", + "composer.replying_to": "Replying to %1", + "composer.new_topic": "Jauns temats", + "composer.uploading": "uploading...", + "composer.thumb_url_label": "Paste a topic thumbnail URL", + "composer.thumb_title": "Add a thumbnail to this topic", + "composer.thumb_url_placeholder": "http://example.com/thumb.png", + "composer.thumb_file_label": "Or upload a file", + "composer.thumb_remove": "Clear fields", + "composer.drag_and_drop_images": "Drag and Drop Images Here", + "more_users_and_guests": "Vēl %1 lietotājs(-i) un %2 viesi(-s)", + "more_users": "%1 more user(s)", + "more_guests": "%1 more guest(s)", + "users_and_others": "%1 un %2 citi", + "sort_by": "Sort by", + "oldest_to_newest": "Oldest to Newest", + "newest_to_oldest": "Newest to Oldest", + "most_votes": "Most Votes", + "most_posts": "Most Posts", + "stale.title": "Tā vietā izveidot jaunu tematu?", + "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", + "stale.create": "Izveidot jaunu tematu", + "stale.reply_anyway": "Reply to this topic anyway", + "link_back": "Re: [%1](%2)", + "diffs.title": "Post Edit History", + "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", + "diffs.no-revisions-description": "This post has %1 revisions.", + "diffs.current-revision": "current revision", + "diffs.original-revision": "original revision" +} \ No newline at end of file diff --git a/public/language/lv/unread.json b/public/language/lv/unread.json new file mode 100644 index 0000000000..75205d61c4 --- /dev/null +++ b/public/language/lv/unread.json @@ -0,0 +1,15 @@ +{ + "title": "Unread", + "no_unread_topics": "There are no unread topics.", + "load_more": "Load More", + "mark_as_read": "Atzīmēt kā lasītu", + "selected": "Selected", + "all": "All", + "all_categories": "All categories", + "topics_marked_as_read.success": "Temati atzīmēti kā lasīti!", + "all-topics": "All Topics", + "new-topics": "Jauni temati", + "watched-topics": "Watched Topics", + "unreplied-topics": "Unreplied Topics", + "multiple-categories-selected": "Multiple Selected" +} \ No newline at end of file diff --git a/public/language/lv/uploads.json b/public/language/lv/uploads.json new file mode 100644 index 0000000000..651a839876 --- /dev/null +++ b/public/language/lv/uploads.json @@ -0,0 +1,9 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb", + "no-uploads-found": "No uploads found", + "public-uploads-info": "Uploads are public, all visitors can see them.", + "private-uploads-info": "Uploads are private, only logged in users can see them." +} \ No newline at end of file diff --git a/public/language/lv/user.json b/public/language/lv/user.json new file mode 100644 index 0000000000..1fd9121274 --- /dev/null +++ b/public/language/lv/user.json @@ -0,0 +1,173 @@ +{ + "banned": "Banned", + "offline": "Offline", + "deleted": "Deleted", + "username": "User Name", + "joindate": "Join Date", + "postcount": "Post Count", + "email": "Email", + "confirm_email": "Confirm Email", + "account_info": "Account Info", + "ban_account": "Ban Account", + "ban_account_confirm": "Do you really want to ban this user?", + "unban_account": "Unban Account", + "delete_account": "Delete Account", + "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your password to confirm that you wish to destroy this account.", + "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", + "fullname": "Full Name", + "website": "Website", + "location": "Location", + "age": "Age", + "joined": "Joined", + "lastonline": "Last Online", + "profile": "Profile", + "profile_views": "Profile views", + "reputation": "Reputation", + "bookmarks": "Bookmarks", + "watched": "Watched", + "ignored": "Ignored", + "followers": "Tie, kuri mani seko", + "following": "Tie, kuri es sekoju", + "blocks": "Blocks", + "block_toggle": "Toggle Block", + "block_user": "Block User", + "unblock_user": "Unblock User", + "aboutme": "About me", + "signature": "Signature", + "birthday": "Birthday", + "chat": "Sarunāties", + "chat_with": "Turpināt sarunu ar %1", + "new_chat_with": "Sākt jaunu sarunu ar %1", + "flag-profile": "Flag Profile", + "follow": "Sekot", + "unfollow": "Pārtraukt sekot", + "more": "More", + "profile_update_success": "Profile has been updated successfully!", + "change_picture": "Change Picture", + "change_username": "Change Username", + "change_email": "Change Email", + "edit": "Edit", + "edit-profile": "Edit Profile", + "default_picture": "Default Icon", + "uploaded_picture": "Uploaded Picture", + "upload_new_picture": "Upload New Picture", + "upload_new_picture_from_url": "Upload New Picture From URL", + "current_password": "Current Password", + "change_password": "Change Password", + "change_password_error": "Invalid Password!", + "change_password_error_wrong_current": "Your current password is not correct!", + "change_password_error_match": "Passwords must match!", + "change_password_error_privileges": "You do not have the rights to change this password.", + "change_password_success": "Your password is updated!", + "confirm_password": "Confirm Password", + "password": "Password", + "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %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.", + "upload_picture": "Upload picture", + "upload_a_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", + "settings": "Settings", + "show_email": "Rādīt manu e-pasta adresi", + "show_fullname": "Rādīt manu vārdu un uzvārdu", + "restrict_chats": "Atļaut sarunas tikai no tiem lietotājiem, kurus es sekoju", + "digest_label": "Subscribe to Digest", + "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", + "digest_off": "Off", + "digest_daily": "Daily", + "digest_weekly": "Weekly", + "digest_monthly": "Monthly", + "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "has_no_follower": "Šim lietotājam nav nevienu sekotāju :(", + "follows_no_one": "Šis lietotājs neseko nevienam :(", + "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": "Šis lietotājs vēl nav balsojis par nevienu ziņu.", + "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", + "has_no_voted_posts": "This user has no voted posts", + "has_no_blocks": "You have blocked no users.", + "email_hidden": "E-pasta adrese paslēpta", + "hidden": "paslēpts", + "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "topics_per_page": "Topics per Page", + "posts_per_page": "Posts per Page", + "max_items_per_page": "Maximum %1", + "acp_language": "Admin Page Language", + "notification_sounds": "Play a sound when you receive a notification", + "notifications_and_sounds": "Notifications & Sounds", + "incoming-message-sound": "Incoming message sound", + "outgoing-message-sound": "Outgoing message sound", + "notification-sound": "Notification sound", + "no-sound": "No sound", + "upvote-notif-freq": "Balsojumu par biežums", + "upvote-notif-freq.all": "Visas balsis par", + "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.everyTen": "Katru desmit balsu par", + "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", + "browsing": "Browsing Settings", + "open_links_in_new_tab": "Open outgoing links in new tab", + "enable_topic_searching": "Enable In-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", + "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", + "grouptitle": "Group Title", + "no-group-title": "No group title", + "select-skin": "Select a Skin", + "select-homepage": "Select a Homepage", + "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": "Moderatora piezīmes saglabātas", + "info.moderation-note.add": "Add note", + "consent.title": "Your Rights & Consent", + "consent.lead": "This community forum collects and processes your personal information.", + "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", + "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", + "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", + "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", + "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", + "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", + "consent.give": "Give consent", + "consent.right_of_access": "You have the Right of Access", + "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", + "consent.right_to_rectification": "You have the Right to Rectification", + "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", + "consent.right_to_erasure": "You have the Right to Erasure", + "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", + "consent.right_to_data_portability": "You have the Right to Data Portability", + "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", + "consent.export_profile": "Export Profile (.csv)", + "consent.export_uploads": "Export Uploaded Content (.zip)", + "consent.export_posts": "Export Posts (.csv)" +} \ No newline at end of file diff --git a/public/language/lv/users.json b/public/language/lv/users.json new file mode 100644 index 0000000000..79ea4f5c7e --- /dev/null +++ b/public/language/lv/users.json @@ -0,0 +1,21 @@ +{ + "latest_users": "Latest Users", + "top_posters": "Top Posters", + "most_reputation": "Most Reputation", + "most_flags": "Most Flags", + "search": "Search", + "enter_username": "Enter a username to search", + "load_more": "Load More", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", + "filter-by": "Filter By", + "online-only": "Online only", + "invite": "Uzaicināt", + "invitation-email-sent": "Uzaicinājuma e-pasta ir nosūtīts %1", + "user_list": "User List", + "recent_topics": "Recent Topics", + "popular_topics": "Popular Topics", + "unread_topics": "Unread Topics", + "categories": "Categories", + "tags": "Tags", + "no-users-found": "No users found!" +} \ No newline at end of file From a06b33a713e07b33062ac4ee087ebda9f91fb0b9 Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Mon, 27 Aug 2018 18:40:56 -0400 Subject: [PATCH 129/310] fix html characters when cloning children categories --- src/categories/create.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/categories/create.js b/src/categories/create.js index c4cf728701..55e434f1a0 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -122,6 +122,8 @@ module.exports = function (Categories) { child.parentCid = parentCid; child.cloneFromCid = child.cid; child.cloneChildren = true; + child.name = utils.decodeHTMLEntities(child.name); + child.description = utils.decodeHTMLEntities(child.description); child.uid = uid; }); From 6bb62a4728bd84ec888ea0d8278b5beb0c698ea0 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 28 Aug 2018 09:31:58 +0000 Subject: [PATCH 130/310] Latest translations and fallbacks --- public/language/sr/error.json | 2 +- public/language/sr/global.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/language/sr/error.json b/public/language/sr/error.json index cbc757f399..698527c6c7 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -78,7 +78,7 @@ "still-uploading": "Сачекајте док се отпремања не заврше.", "file-too-big": "Највећа дозвољена величина датотеке је %1 kB - отпремите мању датотеку.", "guest-upload-disabled": "Гостима је онемогућено отпремање", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Није могуће отпремити слику због погрешно конфигурисаног CORS", "already-bookmarked": "Већ сте додали ову поруку у обележиваче", "already-unbookmarked": "Већ сте одстранили ову поруку из обележивача", "cant-ban-other-admins": "Не можете забранити друге администраторе!", diff --git a/public/language/sr/global.json b/public/language/sr/global.json index 075ba4b8e0..68ed4eef22 100644 --- a/public/language/sr/global.json +++ b/public/language/sr/global.json @@ -85,7 +85,7 @@ "language": "Језик", "guest": "Гост", "guests": "Гости", - "former_user": "A Former User", + "former_user": "Бивши корисник", "updated.title": "Форум је ажуриран", "updated.message": "Форум је управо ажуриран на последњу верзију. Кликните овде да бисте освежили страницу.", "privacy": "Приватност", From 1e3cdc99ac03a32f649c6a45af2f8d54dbfbdf83 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 28 Aug 2018 14:29:47 -0400 Subject: [PATCH 131/310] fixes #6702 --- src/upgrades/1.10.2/username_email_history.js | 62 +++++++++++++++++++ src/user/create.js | 4 ++ 2 files changed, 66 insertions(+) create mode 100644 src/upgrades/1.10.2/username_email_history.js diff --git a/src/upgrades/1.10.2/username_email_history.js b/src/upgrades/1.10.2/username_email_history.js new file mode 100644 index 0000000000..a3f6fcc347 --- /dev/null +++ b/src/upgrades/1.10.2/username_email_history.js @@ -0,0 +1,62 @@ +'use strict'; + +var db = require('../../database'); + +var async = require('async'); +var batch = require('../../batch'); +var user = require('../../user'); + +module.exports = { + name: 'Record first entry in username/email history', + timestamp: Date.UTC(2018, 7, 28), + method: function (callback) { + batch.processSortedSet('users:joindate', function (ids, next) { + async.each(ids, function (uid, next) { + async.parallel([ + function (next) { + // Username + async.waterfall([ + async.apply(db.sortedSetCard, 'user:' + uid + ':usernames'), + (count, next) => { + if (count > 0) { + // User has changed their username before, no record of original username, skip. + return setImmediate(next, null, null); + } + + user.getUserFields(uid, ['username', 'joindate'], next); + }, + (userdata, next) => { + if (!userdata) { + return setImmediate(next); + } + + db.sortedSetAdd('user:' + uid + ':usernames', userdata.joindate, [userdata.username, userdata.joindate].join(':'), next); + }, + ], next); + }, + function (next) { + // Email + async.waterfall([ + async.apply(db.sortedSetCard, 'user:' + uid + ':emails'), + (count, next) => { + if (count > 0) { + // User has changed their email before, no record of original email, skip. + return setImmediate(next, null, null); + } + + user.getUserFields(uid, ['email', 'joindate'], next); + }, + (userdata, next) => { + if (!userdata) { + return setImmediate(next); + } + + db.sortedSetAdd('user:' + uid + ':emails', userdata.joindate, [userdata.email, userdata.joindate].join(':'), next); + }, + ], next); + }, + ], next); + }, next); + }, callback); + }, +}; diff --git a/src/user/create.js b/src/user/create.js index b0eba41c6b..a82c050409 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -93,6 +93,9 @@ module.exports = function (User) { function (next) { db.sortedSetsAdd(['users:postcount', 'users:reputation'], 0, userData.uid, next); }, + function (next) { + db.sortedSetAdd('user:' + userData.uid + ':usernames', timestamp, userData.username, next); + }, function (next) { groups.join('registered-users', userData.uid, next); }, @@ -104,6 +107,7 @@ module.exports = function (User) { async.parallel([ async.apply(db.sortedSetAdd, 'email:uid', userData.uid, userData.email.toLowerCase()), async.apply(db.sortedSetAdd, 'email:sorted', 0, userData.email.toLowerCase() + ':' + userData.uid), + async.apply(db.sortedSetAdd, 'user:' + userData.uid + ':emails', timestamp, userData.email), ], next); if (parseInt(userData.uid, 10) !== 1 && parseInt(meta.config.requireEmailConfirmation, 10) === 1) { From 2a2e8136cd8fa67c8fd714755dba872616597a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 28 Aug 2018 16:19:37 -0400 Subject: [PATCH 132/310] fix tests --- test/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/user.js b/test/user.js index c0d7cb9e18..18fd77ece4 100644 --- a/test/user.js +++ b/test/user.js @@ -702,7 +702,7 @@ describe('User', function () { assert.ifError(err); db.getSortedSetRevRange('user:' + uid + ':usernames', 0, -1, function (err, data) { assert.ifError(err); - assert.equal(data.length, 1); + assert.equal(data.length, 2); assert(data[0].startsWith('updatedAgain')); done(); }); From e79f0dad90162210c591ff4168aae1e6fee90078 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 29 Aug 2018 09:32:27 +0000 Subject: [PATCH 133/310] Latest translations and fallbacks --- public/language/cs/admin/advanced/database.json | 4 ++-- public/language/cs/admin/manage/categories.json | 2 +- public/language/cs/admin/settings/advanced.json | 8 ++++---- public/language/cs/admin/settings/uploads.json | 6 +++--- public/language/cs/email.json | 4 ++-- public/language/cs/error.json | 2 +- public/language/cs/global.json | 2 +- public/language/cs/groups.json | 2 +- public/language/cs/modules.json | 4 ++-- public/language/cs/pages.json | 8 ++++---- public/language/cs/user.json | 8 ++++---- public/language/lv/admin/appearance/customise.json | 12 ++++++------ public/language/lv/admin/appearance/skins.json | 2 +- public/language/lv/admin/appearance/themes.json | 2 +- public/language/lv/admin/general/dashboard.json | 4 ++-- public/language/lv/admin/general/homepage.json | 10 +++++----- public/language/lv/admin/general/navigation.json | 2 +- public/language/lv/admin/manage/categories.json | 2 +- public/language/lv/admin/menu.json | 4 ++-- public/language/lv/admin/settings/email.json | 2 +- public/language/lv/admin/settings/post.json | 4 ++-- public/language/lv/admin/settings/uploads.json | 2 +- public/language/lv/admin/settings/web-crawler.json | 2 +- public/language/lv/error.json | 2 +- public/language/lv/global.json | 8 ++++---- public/language/lv/pages.json | 14 +++++++------- public/language/lv/recent.json | 2 +- public/language/lv/unread.json | 4 ++-- public/language/lv/user.json | 8 ++++---- public/language/lv/users.json | 4 ++-- public/language/tr/users.json | 2 +- 31 files changed, 71 insertions(+), 71 deletions(-) diff --git a/public/language/cs/admin/advanced/database.json b/public/language/cs/admin/advanced/database.json index 380f8e2d0e..7a2017a06b 100644 --- a/public/language/cs/admin/advanced/database.json +++ b/public/language/cs/admin/advanced/database.json @@ -35,6 +35,6 @@ "redis.raw-info": "Informace Redis Raw", "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", - "postgres.raw-info": "Postgres Raw Info" + "postgres.version": "Verze PostgreSQL", + "postgres.raw-info": "Informace o Postgres" } diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index 317c003097..af3e2a446e 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -19,7 +19,7 @@ "parent-category-none": "(nic)", "copy-settings": "Kopírovat nastavení z", "optional-clone-settings": "Klonovat nastavení z kategorie (doporučeno)", - "clone-children": "Clone Children Categories And Settings", + "clone-children": "Klonovat podřízené kategorie a nastavení", "purge": "Vyčistit kategorii", "enable": "Povolit", diff --git a/public/language/cs/admin/settings/advanced.json b/public/language/cs/admin/settings/advanced.json index 8c3fecc48a..3e6e88a59f 100644 --- a/public/language/cs/admin/settings/advanced.json +++ b/public/language/cs/admin/settings/advanced.json @@ -12,11 +12,11 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", - "hsts": "Strict Transport Security", - "hsts.enabled": "Enabled HSTS (recommended)", + "hsts": "Přísné zabezpečení přenosu", + "hsts.enabled": "Povolit HSTS (doporučeno)", "hsts.subdomains": "Zahrnout poddomény v hlavičce HSTS", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.preload": "Povolit před-načtení hlavičky HSTS", + "hsts.help": "Je-li povoleno, bude nastavena pro tyto stránky hlavička HSTS . Můžete si v hlavičce zvolit zahrnutí i poddomén a přednastavených příznaků. Nejste-li si jist/a, ponechte nezaškrtnutéVíce informací ", "traffic-management": "Správa provozu", "traffic.help": "NodeBB obsahuje modul, který automaticky zamítá požadavky při vysokém vytížení. Toto nastavení můžete zde upravit, ačkoliv výchozí hodnoty jsou zaručením úspěchu.", "traffic.enable": "Povolit správu provozu", diff --git a/public/language/cs/admin/settings/uploads.json b/public/language/cs/admin/settings/uploads.json index d4241414a9..a837528c1b 100644 --- a/public/language/cs/admin/settings/uploads.json +++ b/public/language/cs/admin/settings/uploads.json @@ -1,9 +1,9 @@ { "posts": "Příspěvky", "allow-files": "Povolit uživatelům nahrávat normální soubory", - "private": "Nahrané soubory jsou sokromé", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private": "Nahrané soubory jsou soukromé", + "private-extensions": "Přípona souborů je soukromá", + "private-uploads-extensions-help": "Pro nastavení soukromí, zde zadejte seznam souborů oddělený čárkou (tj. pdf, xls,doc). prázdný seznam znamená, že všechny soubory jsou soukromé.", "max-image-width": "Zmenšit velikost obrázků na potřebné rozlišení (v pixelech)", "max-image-width-help": "(v pixelech, výchozí: 760 pixelů, pro zákaz nastavte 0)", "resize-image-quality": "Kvalita při změně velikosti obrázků", diff --git a/public/language/cs/email.json b/public/language/cs/email.json index 58ef19575e..7f406006de 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -4,8 +4,8 @@ "invite": "Pozvánka od %1", "greeting_no_name": "Dobrý den", "greeting_with_name": "Dobrý den %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Ověřte prosím vaší e-mailovou adresu", + "email.verify.text1": "Vaše e-mailová adresa byla změněna.", "welcome.text1": "Děkujeme vám za registraci na %1!", "welcome.text2": "Pro úplnou aktivaci vašeho účtu potřebujeme ověřit vaši e-mailovou adresu.", "welcome.text3": "Administrátor právě potvrdil vaší registraci. Nyní se můžete přihlásit jménem a heslem.", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index e25a932925..1750d81969 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -78,7 +78,7 @@ "still-uploading": "Vyčkejte, než se vše kompletně nahraje.", "file-too-big": "Maximální povolená velikost je %1 kB – nahrajte menší soubor", "guest-upload-disabled": "Nahrávání od hostů nebylo povoleno", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Není možné nahrát obrázek díky špatně nakonfigurovanému „Cross-Origin Resource Sharing (CORS)”", "already-bookmarked": "Již jste tento příspěvek zazáložkoval", "already-unbookmarked": "Již jste u tohoto příspěvku odebral záložku", "cant-ban-other-admins": "Nemůžete zablokovat jiné správce.", diff --git a/public/language/cs/global.json b/public/language/cs/global.json index 83d8151a93..d9da20d589 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -85,7 +85,7 @@ "language": "Jazyk", "guest": "Host", "guests": "Hosté", - "former_user": "A Former User", + "former_user": "Bývalý uživatel", "updated.title": "Fórum bylo zaktualizováno", "updated.message": "Toto fórum bylo právě aktualizováno na poslední verzi. Klikněte zde a obnovte tuto stránku.", "privacy": "Soukromí", diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 24c2aec730..136d7ea388 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -28,7 +28,7 @@ "details.grant": "Přidat/Zrušit vlastnictví", "details.kick": "Vyhodit", "details.kick_confirm": "Jste si jist/a, že chcete vyjmout tohoto uživatele ze skupiny?", - "details.add-member": "Add Member", + "details.add-member": "Přidat uživatele", "details.owner_options": "Správa skupiny", "details.group_name": "Název skupiny", "details.member_count": "Počet členů", diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index cca5e31f1a..ca89b37a00 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Jste si jist/a, že chcete odstranit tuto zprávu?", "chat.retrieving-users": "Získávání seznamu uživatelů...", "chat.manage-room": "Spravovat konverzační místnosti", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Zde můžete vyhledávat uživatele. Jakmile si ho vyberete, uživatel bude přidán do konverzace. Nový uživatel nebude mít zobrazeny zprávy konverzace napsané dříve, než byl do konverzace přidán. Jen majitelé místnosti () mohou odebrat uživatele z konverzační místnosti.", "chat.confirm-chat-with-dnd-user": "Tento uživatel nastavil svůj stav na NERUŠIT. Opravdu chcete začít s ním konverzaci.", "chat.rename-room": "Přejmenovat místnost", "chat.rename-placeholder": "Zde zadejte název místnosti", @@ -33,7 +33,7 @@ "chat.in-room": "V této místnosti", "chat.kick": "Vykopnout", "chat.show-ip": "Zobrazit IP", - "chat.owner": "Room Owner", + "chat.owner": "Majitel místnosti", "composer.compose": "Napsat", "composer.show_preview": "Ukázat náhled", "composer.hide_preview": "Skrýt náhled", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index 708c15ab85..79e91fc4be 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -6,10 +6,10 @@ "popular-month": "Oblíbená témata pro tento měsíc", "popular-alltime": "Oblíbená témata za celou dobu", "recent": "Aktuální témata", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Dnešní témata s nejvíce souhlasy", + "top-week": "Týdenní témata s nejvíce souhlasy", + "top-month": "Měsíční témata s nejvíce souhlasy", + "top-alltime": "Témata s nejvíce souhlasy", "moderator-tools": "Nástroje moderátora", "flagged-content": "Nahlášený obsah", "ip-blacklist": "Černá listina IP adres", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 9c884e1c05..1d28996a1b 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -31,8 +31,8 @@ "following": "Sleduje", "blocks": "Zablokováni", "block_toggle": "Přepnout zablokování", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Zablokovat uživatele", + "unblock_user": "Odblokovat uživatele", "aboutme": "O mně", "signature": "Podpis", "birthday": "Datum narození", @@ -109,9 +109,9 @@ "no-sound": "Bez zvuku", "upvote-notif-freq": "Frekvence upozornění na souhlasy", "upvote-notif-freq.all": "Všechny souhlasy", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "První podle příspěvku", "upvote-notif-freq.everyTen": "Každý desátý souhlas", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "Dle 1, 5, 10, 25, 50, 100, 150, 200, ...", "upvote-notif-freq.logarithmic": "Dle 10, 100, 1000...", "upvote-notif-freq.disabled": "Zakázáno", "browsing": "Nastavení prohlížení", diff --git a/public/language/lv/admin/appearance/customise.json b/public/language/lv/admin/appearance/customise.json index 017fcbf984..3d62c38ae6 100644 --- a/public/language/lv/admin/appearance/customise.json +++ b/public/language/lv/admin/appearance/customise.json @@ -1,15 +1,15 @@ { - "custom-css": "Custom CSS/LESS", + "custom-css": "Pielāgotais CSS/LESS", "custom-css.description": "Enter your own CSS/LESS declarations here, which will be applied after all other styles.", - "custom-css.enable": "Enable Custom CSS/LESS", + "custom-css.enable": "Iespējot pielāgotu CSS/LESS", - "custom-js": "Custom Javascript", + "custom-js": "Pielāgotais 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.enable": "Iespējot pielāgotu Javascript", - "custom-header": "Custom Header", + "custom-header": "Pielāgotā galvene", "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.enable": "Iespējot pielāgotu galveni", "custom-css.livereload": "Enable Live Reload", "custom-css.livereload.description": "Iespējot šo, lai piespiestu visas tiešsaistes sesijas ikvienā no Tava konta esošajām ierīcēm atsvaidzināt katru reizi, kad noklikšķini uz Saglabāt" diff --git a/public/language/lv/admin/appearance/skins.json b/public/language/lv/admin/appearance/skins.json index 4db6fbdd8a..ebc6408daf 100644 --- a/public/language/lv/admin/appearance/skins.json +++ b/public/language/lv/admin/appearance/skins.json @@ -1,6 +1,6 @@ { "loading": "Loading Skins...", - "homepage": "Homepage", + "homepage": "Sākumlapa", "select-skin": "Select Skin", "current-skin": "Current Skin", "skin-updated": "Skin Updated", diff --git a/public/language/lv/admin/appearance/themes.json b/public/language/lv/admin/appearance/themes.json index 597830f379..eaaee96e89 100644 --- a/public/language/lv/admin/appearance/themes.json +++ b/public/language/lv/admin/appearance/themes.json @@ -1,6 +1,6 @@ { "checking-for-installed": "Checking for installed themes...", - "homepage": "Homepage", + "homepage": "Sākumlapa", "select-theme": "Select Theme", "current-theme": "Current Theme", "no-themes": "No installed themes found", diff --git a/public/language/lv/admin/general/dashboard.json b/public/language/lv/admin/general/dashboard.json index 282b7409e8..260a80880b 100644 --- a/public/language/lv/admin/general/dashboard.json +++ b/public/language/lv/admin/general/dashboard.json @@ -8,7 +8,7 @@ "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": "Pielāgotais datumu diapazons", "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", @@ -60,7 +60,7 @@ "reading-posts": "Reading posts", "browsing-topics": "Browsing topics", "recent": "Recent", - "unread": "Unread", + "unread": "Nelasītie", "high-presence-topics": "High Presence Topics", diff --git a/public/language/lv/admin/general/homepage.json b/public/language/lv/admin/general/homepage.json index 7428d59eeb..49dc5a99fb 100644 --- a/public/language/lv/admin/general/homepage.json +++ b/public/language/lv/admin/general/homepage.json @@ -1,8 +1,8 @@ { - "home-page": "Home Page", + "home-page": "Sākumlapa", "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", - "home-page-title": "Title of the home page (default \"Home\")" + "home-page-route": "Sākumlapa adrese", + "custom-route": "Pielāgotā adrese", + "allow-user-home-pages": "Atļaut lietotāju mājaslapas", + "home-page-title": "Sākumlapas virsraksts (pēc noklusējuma \"Sākums\")" } \ No newline at end of file diff --git a/public/language/lv/admin/general/navigation.json b/public/language/lv/admin/general/navigation.json index a199668ae2..4b08a5e323 100644 --- a/public/language/lv/admin/general/navigation.json +++ b/public/language/lv/admin/general/navigation.json @@ -19,7 +19,7 @@ "btn.enable": "Enable", "available-menu-items": "Available Menu Items", - "custom-route": "Custom Route", + "custom-route": "Pielāgotā adrese", "core": "core", "plugin": "plugin" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 758785d689..af0b4dac87 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -7,7 +7,7 @@ "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", - "custom-class": "Custom Class", + "custom-class": "Pielāgotā klase", "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index faf99f5ee5..2d8213927a 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -1,7 +1,7 @@ { "section-general": "General", "general/dashboard": "Dashboard", - "general/homepage": "Home Page", + "general/homepage": "Sākumlapa", "general/navigation": "Navigation", "general/languages": "Languages", "general/sounds": "Sounds", @@ -42,7 +42,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom Content (HTML/JS/CSS)", + "appearance/customise": "Pielāgotais saturs (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/lv/admin/settings/email.json b/public/language/lv/admin/settings/email.json index 50ad2e06ea..09ea438384 100644 --- a/public/language/lv/admin/settings/email.json +++ b/public/language/lv/admin/settings/email.json @@ -9,7 +9,7 @@ "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", "smtp-transport.service": "Select a service", - "smtp-transport.service-custom": "Custom Service", + "smtp-transport.service-custom": "Pielāgotais serviss", "smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.", "smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", "smtp-transport.gmail-warning2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", diff --git a/public/language/lv/admin/settings/post.json b/public/language/lv/admin/settings/post.json index 6594fe384b..b0baded53b 100644 --- a/public/language/lv/admin/settings/post.json +++ b/public/language/lv/admin/settings/post.json @@ -33,7 +33,7 @@ "teaser.last-post": "Last – Show the latest post, including the original post, if no replies", "teaser.last-reply": "Last – Show the latest reply, or a \"No replies\" placeholder if no replies", "teaser.first": "First", - "unread": "Unread Settings", + "unread": "Nelasītie iestatījumi", "unread.cutoff": "Unread cutoff days", "unread.min-track-last": "Minimum posts in topic before tracking last read", "recent": "Recent Settings", @@ -47,7 +47,7 @@ "composer-help": "The following settings govern the functionality and/or appearance of the post composer shown\n\t\t\t\tto users when they create new topics, or reply to existing topics.", "composer.show-help": "Show \"Help\" tab", "composer.enable-plugin-help": "Allow plugins to add content to the help tab", - "composer.custom-help": "Custom Help Text", + "composer.custom-help": "Pielāgotais palīdzības teksts", "ip-tracking": "IP Tracking", "ip-tracking.each-post": "Track IP Address for each post", "enable-post-history": "Enable Post History" diff --git a/public/language/lv/admin/settings/uploads.json b/public/language/lv/admin/settings/uploads.json index e0382bd8da..e2963d4a3d 100644 --- a/public/language/lv/admin/settings/uploads.json +++ b/public/language/lv/admin/settings/uploads.json @@ -17,7 +17,7 @@ "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", + "default-avatar": "Pielāgotais noklusējuma stilizētais portrets", "upload": "Upload", "profile-image-dimension": "Profile Image Dimension", "profile-image-dimension-help": "(in pixels, default: 128 pixels)", diff --git a/public/language/lv/admin/settings/web-crawler.json b/public/language/lv/admin/settings/web-crawler.json index 2e0d31d12b..e111b38384 100644 --- a/public/language/lv/admin/settings/web-crawler.json +++ b/public/language/lv/admin/settings/web-crawler.json @@ -1,6 +1,6 @@ { "crawlability-settings": "Crawlability Settings", - "robots-txt": "Custom Robots.txt Leave blank for default", + "robots-txt": "Pielāgotais Robots.txt Noklusējuma gadījumā atstāj tukšu", "sitemap-feed-settings": "Sitemap & Feed Settings", "disable-rss-feeds": "Disable RSS Feeds", "disable-sitemap-xml": "Disable Sitemap.xml", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index bf7ef7a22e..cc2d8b4177 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -145,7 +145,7 @@ "no-users-in-room": "Šajā istabā nav lietotāju", "cant-kick-self": "Tu nevari sevi izslēgt no grupas", "no-users-selected": "Nav atlasīts neviens lietotājs(-i)", - "invalid-home-page-route": "Nederīgs sākumlapas URL", + "invalid-home-page-route": "Nederīga sākumlapas adrese", "invalid-session": "Tiešsaistes sesijas nesakrīt", "invalid-session-text": "Izskatās, ka Tava tiešsaistes sesija vairs nav aktīva vai vairs nesakrīt ar serveri. Lūdzu, atsvaidzini šo lapu.", "no-topics-selected": "Nav atlasīts neviens temats", diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 7161b9826a..5b2e035540 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -1,16 +1,16 @@ { - "home": "Mājas", + "home": "Sākums", "search": "Meklēt", "buttons.close": "Aizvērt", "403.title": "Piekļuve liegta", "403.message": "Šķiet, ka esi uznācis uz lapu, kurai Tev nav piekļuves.", "403.login": "Varbūt Tev vajadzētu mēģināt pierakstīties?", "404.title": "Nav atrasts", - "404.message": "Šķiet, ka esi uznācis uz lapu, kura neeksistē. Atgriezies mājaslapā.", + "404.message": "Šķiet, ka esi uznācis uz lapu, kura neeksistē. Atgriezies sākumlapā.", "500.title": "Iekšēja kļūda.", "500.message": "Hmm... Izskatās, ka kaut kas noticis nepareizi!", "400.title": "Nepareizs pieprasījums.", - "400.message": "Šķiet, ka šī saite ir nepareiza, lūdzu, pārbaudi un mēģini vēlreiz. Pretējā gadījumā atgriezies mājaslapā.", + "400.message": "Šķiet, ka šī saite ir nepareiza, lūdzu, pārbaudi un mēģini vēlreiz. Pretējā gadījumā atgriezies sākumlapā.", "register": "Reģistrēties", "login": "Pieteikties", "please_log_in": "Lūdzu, pieteikties", @@ -29,7 +29,7 @@ "header.recent": "Nesenie", "header.unread": "Nelasītie", "header.tags": "Birkas", - "header.popular": "Ieredzētie", + "header.popular": "Populārie", "header.users": "Lietotāji", "header.groups": "Grupas", "header.chats": "Sarunas", diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 311413bd2a..4bf7667d4d 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -1,11 +1,11 @@ { - "home": "Home", - "unread": "Unread Topics", - "popular-day": "Popular topics today", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", - "popular-alltime": "All time popular topics", - "recent": "Recent Topics", + "home": "Sākums", + "unread": "Nelasītie temati", + "popular-day": "Populārās tēmas šodien", + "popular-week": "Populārās tēmas šonedēļ", + "popular-month": "Populārās tēmas šajā mēnesī", + "popular-alltime": "Visu laiku populārās tēmas", + "recent": "Nesenās tēmas", "top-day": "Top voted topics today", "top-week": "Top voted topics this week", "top-month": "Top voted topics this month", diff --git a/public/language/lv/recent.json b/public/language/lv/recent.json index f993a65464..b2a40cd9e6 100644 --- a/public/language/lv/recent.json +++ b/public/language/lv/recent.json @@ -6,7 +6,7 @@ "year": "Year", "alltime": "All Time", "no_recent_topics": "There are no recent topics.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Populāras tēmas nav", "there-is-a-new-topic": "Ir jauns temats.", "there-is-a-new-topic-and-a-new-post": "Ir jauns temats un jauna ziņa.", "there-is-a-new-topic-and-new-posts": "Ir jauns temats un %1 jaunas ziņas.", diff --git a/public/language/lv/unread.json b/public/language/lv/unread.json index 75205d61c4..29f4bc04e6 100644 --- a/public/language/lv/unread.json +++ b/public/language/lv/unread.json @@ -1,6 +1,6 @@ { - "title": "Unread", - "no_unread_topics": "There are no unread topics.", + "title": "Nelasītie", + "no_unread_topics": "Nav nevieni nelasīti temati", "load_more": "Load More", "mark_as_read": "Atzīmēt kā lasītu", "selected": "Selected", diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 1fd9121274..0d433aef57 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -126,10 +126,10 @@ "grouptitle": "Group Title", "no-group-title": "No group title", "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "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", + "select-homepage": "Izvēlēties sākumlapu", + "homepage": "Sākumlapa", + "homepage_description": "Izvēlies lapu, kuru izmantot kā foruma mājaslapu vai 'Nav', lai izmantotu noklusējuma sākumlapu.", + "custom_route": "Pielāgotā mājaslapas adrese", "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", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index 79ea4f5c7e..4a9e92fb86 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -13,8 +13,8 @@ "invitation-email-sent": "Uzaicinājuma e-pasta ir nosūtīts %1", "user_list": "User List", "recent_topics": "Recent Topics", - "popular_topics": "Popular Topics", - "unread_topics": "Unread Topics", + "popular_topics": "Populārās tēmas", + "unread_topics": "Nelasītie temati", "categories": "Categories", "tags": "Tags", "no-users-found": "No users found!" diff --git a/public/language/tr/users.json b/public/language/tr/users.json index 0f9df57643..394d750220 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -10,7 +10,7 @@ "filter-by": "Şu şekilde filtrele", "online-only": "Sadece çevrimiçi", "invite": "Davet et", - "invitation-email-sent": "%1'e bir davet e-postası gönderildi", + "invitation-email-sent": "%1'e bir davet e-posta'sı gönderildi", "user_list": "Kullanıcı Listesi", "recent_topics": "Güncel Başlıklar", "popular_topics": "Popüler Başlıklar", From 5c04ec2d6308f2a182f8c7565f8cf5e427264087 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 29 Aug 2018 14:31:39 -0400 Subject: [PATCH 134/310] removed client-side chat message length check in favour of server-side check, firing new hook on messaging.checkContent for hooks to intercept --- public/src/client/chats/messages.js | 4 ---- src/messaging/create.js | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/public/src/client/chats/messages.js b/public/src/client/chats/messages.js index 9828f4d065..b6a8ce9b1c 100644 --- a/public/src/client/chats/messages.js +++ b/public/src/client/chats/messages.js @@ -8,10 +8,6 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres var msg = inputEl.val(); var mid = inputEl.attr('data-mid'); - if (msg.length > ajaxify.data.maximumChatMessageLength) { - return app.alertError('[[error:chat-message-too-long,' + ajaxify.data.maximumChatMessageLength + ']]'); - } - if (!msg.length) { return; } diff --git a/src/messaging/create.js b/src/messaging/create.js index 7380ff6f89..c173528c65 100644 --- a/src/messaging/create.js +++ b/src/messaging/create.js @@ -30,13 +30,20 @@ module.exports = function (Messaging) { if (!content) { return callback(new Error('[[error:invalid-chat-message]]')); } - content = String(content); - var maximumChatMessageLength = (meta.config.maximumChatMessageLength || 1000); - if (content.length > maximumChatMessageLength) { - return callback(new Error('[[error:chat-message-too-long, ' + maximumChatMessageLength + ']]')); - } - callback(); + plugins.fireHook('filter:messaging.checkContent', { content: content }, function (err, data) { + if (err) { + return callback(err); + } + + content = String(data.content); + + var maximumChatMessageLength = (meta.config.maximumChatMessageLength || 1000); + if (content.length > maximumChatMessageLength) { + return callback(new Error('[[error:chat-message-too-long, ' + maximumChatMessageLength + ']]')); + } + callback(); + }); }; Messaging.addMessage = function (data, callback) { From ba96a7a7bc80990e16bb14019b127bb033e89e2a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 30 Aug 2018 12:59:19 -0400 Subject: [PATCH 135/310] bump emoji --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7885611a34..be496a9efd 100644 --- a/install/package.json +++ b/install/package.json @@ -69,7 +69,7 @@ "nconf": "^0.10.0", "nodebb-plugin-composer-default": "6.1.1", "nodebb-plugin-dbsearch": "2.0.21", - "nodebb-plugin-emoji": "^2.2.4", + "nodebb-plugin-emoji": "^2.2.5", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.7.2", "nodebb-plugin-mentions": "2.2.8", From d3ee71e09fd58929f9b0c439e866483f70914cd1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 30 Aug 2018 14:01:00 -0400 Subject: [PATCH 136/310] bump persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index be496a9efd..727f414031 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.26", + "nodebb-theme-persona": "9.0.27", "nodebb-theme-slick": "1.2.9", "nodebb-theme-vanilla": "10.1.0", "nodebb-widget-essentials": "4.0.7", From 545e678e8a986164e2aca87d067349b92304a781 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 30 Aug 2018 15:08:01 -0400 Subject: [PATCH 137/310] fixes #6726 --- install/package.json | 4 ++-- src/privileges/topics.js | 4 +++- src/socket.io/posts/tools.js | 4 ++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/install/package.json b/install/package.json index 727f414031..48a6784957 100644 --- a/install/package.json +++ b/install/package.json @@ -77,9 +77,9 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.27", + "nodebb-theme-persona": "9.0.28", "nodebb-theme-slick": "1.2.9", - "nodebb-theme-vanilla": "10.1.0", + "nodebb-theme-vanilla": "10.1.1", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 0cbf49e7ae..9e387acc77 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -16,7 +16,7 @@ module.exports = function (privileges) { privileges.topics.get = function (tid, uid, callback) { var topic; - var privs = ['topics:reply', 'topics:read', 'topics:tag', 'topics:delete', 'posts:edit', 'posts:history', 'posts:delete', 'posts:view_deleted', 'read']; + var privs = ['topics:reply', 'topics:read', 'topics:tag', 'topics:delete', 'posts:edit', 'posts:history', 'posts:delete', 'posts:view_deleted', 'read', 'purge']; async.waterfall([ async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked', 'deleted']), function (_topic, next) { @@ -37,6 +37,7 @@ module.exports = function (privileges) { var isAdminOrMod = results.isAdministrator || results.isModerator; var editable = isAdminOrMod; var deletable = isAdminOrMod || (isOwner && privData['topics:delete']); + var purge = results.isAdministrator || privData.purge; plugins.fireHook('filter:privileges.topics.get', { 'topics:reply': (privData['topics:reply'] && !locked && !deleted) || isAdminOrMod, @@ -51,6 +52,7 @@ module.exports = function (privileges) { view_thread_tools: editable || deletable, editable: editable, deletable: deletable, + purge: purge, view_deleted: isAdminOrMod || isOwner, isAdminOrMod: isAdminOrMod, disabled: disabled, diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index 9b2da8ee01..96bd3a2ad7 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -39,6 +39,9 @@ module.exports = function (SocketPosts) { canDelete: function (next) { privileges.posts.canDelete(data.pid, socket.uid, next); }, + canPurge: function (next) { + privileges.posts.canPurge(data.pid, socket.uid, next); + }, canFlag: function (next) { privileges.posts.canFlag(data.pid, socket.uid, next); }, @@ -62,6 +65,7 @@ module.exports = function (SocketPosts) { posts.selfPost = socket.uid && socket.uid === parseInt(posts.uid, 10); posts.display_edit_tools = results.canEdit.flag; posts.display_delete_tools = results.canDelete.flag; + posts.display_purge_tools = results.canPurge; posts.display_flag_tools = socket.uid && !posts.selfPost && results.canFlag.flag; posts.display_moderator_tools = posts.display_edit_tools || posts.display_delete_tools; posts.display_move_tools = results.isAdmin || results.isModerator; From c1725442eab391648ce11fd2d5f3b63d20e4e0f7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 30 Aug 2018 17:03:42 -0400 Subject: [PATCH 138/310] added progress bar to username_email_history upgrade script --- src/upgrades/1.10.2/username_email_history.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/upgrades/1.10.2/username_email_history.js b/src/upgrades/1.10.2/username_email_history.js index a3f6fcc347..1aea342b4b 100644 --- a/src/upgrades/1.10.2/username_email_history.js +++ b/src/upgrades/1.10.2/username_email_history.js @@ -10,6 +10,8 @@ module.exports = { name: 'Record first entry in username/email history', timestamp: Date.UTC(2018, 7, 28), method: function (callback) { + const progress = this.progress; + batch.processSortedSet('users:joindate', function (ids, next) { async.each(ids, function (uid, next) { async.parallel([ @@ -55,8 +57,13 @@ module.exports = { }, ], next); }, - ], next); + ], function (err) { + progress.incr(); + setImmediate(next, err); + }); }, next); + }, { + progress: this.progress, }, callback); }, }; From e882a091a12dd8717ba6b80ef63510f100883e65 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 31 Aug 2018 10:46:28 -0400 Subject: [PATCH 139/310] updated blocks localisations from Tx --- public/language/it/user.json | 10 +++++----- public/language/ja/user.json | 10 +++++----- public/language/pt-BR/user.json | 2 +- public/language/ru/user.json | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/public/language/it/user.json b/public/language/it/user.json index 59d9b7d278..ff9efdf375 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -29,10 +29,10 @@ "ignored": "Ignorati", "followers": "Da chi è seguito", "following": "Chi segue", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "Blocchi", + "block_toggle": "Gestisci blocco", + "block_user": "Blocca utente", + "unblock_user": "Sblocca utente", "aboutme": "Su di me", "signature": "Firma", "birthday": "Data di nascita", @@ -93,7 +93,7 @@ "has_no_upvoted_posts": "Questo utente non ha ancora apprezzato nessun post.", "has_no_downvoted_posts": "Questo utente non ha ancora votato negativamente alcun post", "has_no_voted_posts": "Questo utente non ha post votati", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "Non hai bloccato utenti.", "email_hidden": "Email Nascosta", "hidden": "nascosta", "paginate_description": "Non utilizzare lo scroll infinito per discussioni e messaggi", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index ce27b42f73..54a75eb652 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -29,10 +29,10 @@ "ignored": "無視済み", "followers": "フォロワー", "following": "フォロー中", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "ブロックの設定", + "block_toggle": "ブロックを切替", + "block_user": "ユーザーをブロック", + "unblock_user": "ブロックを解除", "aboutme": "About me", "signature": "署名", "birthday": "誕生日", @@ -93,7 +93,7 @@ "has_no_upvoted_posts": "このユーザーはまだ一つも投稿に高評価を付けていません。", "has_no_downvoted_posts": "このユーザーはまだ一つも投稿に低評価を付けていません。", "has_no_voted_posts": "このユーザーは投稿を評価していません。", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "ブロック中のユーザーはいません。", "email_hidden": "メールアドレスを非表示", "hidden": "非表示", "paginate_description": "無限スクロールの代わりに、投稿やスレッドをページ別で切り替える。", diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 1593a4d286..d5834dd767 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -93,7 +93,7 @@ "has_no_upvoted_posts": "Este usuário ainda não votou quaisquer posts positivamente.", "has_no_downvoted_posts": "Este usuário ainda não votou quaisquer posts negativamente.", "has_no_voted_posts": "Este usuário não tem posts votados", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "Você não bloqueou nenhum usuário.", "email_hidden": "Email Escondido", "hidden": "escondido", "paginate_description": "Paginar tópicos ao invés de utilizar em vez de usar rolagem infinita.", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 0a92f4cc46..25948aa9cc 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -29,10 +29,10 @@ "ignored": "Игнорировать", "followers": "Подписчиков", "following": "Подписок", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "Блокировки", + "block_toggle": "Блок./Разблок", + "block_user": "Блокировать", + "unblock_user": "Разблокировать", "aboutme": "Обо мне", "signature": "Подпись", "birthday": "День рождения", From 0519f8473492cc05ed18ad983cb8b2fa7f581dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 31 Aug 2018 11:04:42 -0400 Subject: [PATCH 140/310] Promisify modules (#6723) * WIP promisify * promisify psql * ability to skip some keys * dont promisify client object * remove async * clone entire module so it has all properties * add shim for node 6 * ignore sessionStore as well * ignore pool on psql --- install/package.json | 1 + src/categories.js | 2 ++ src/database/mongo.js | 4 +++- src/database/postgres.js | 2 ++ src/database/redis.js | 2 ++ src/groups.js | 2 ++ src/messaging.js | 2 ++ src/notifications.js | 2 ++ src/posts.js | 2 ++ src/privileges.js | 2 ++ src/promisify.js | 37 +++++++++++++++++++++++++++++++++++++ src/topics.js | 2 ++ src/user.js | 1 + 13 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/promisify.js diff --git a/install/package.json b/install/package.json index 48a6784957..b07bef8fbd 100644 --- a/install/package.json +++ b/install/package.json @@ -109,6 +109,7 @@ "spider-detector": "1.0.18", "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", + "util.promisify": "1.0.0", "validator": "10.7.0", "winston": "^2.4.0", "xml": "^1.0.1", diff --git a/src/categories.js b/src/categories.js index 1bbc80e599..93d2c87e54 100644 --- a/src/categories.js +++ b/src/categories.js @@ -386,3 +386,5 @@ Categories.filterIgnoringUids = function (cid, uids, callback) { }, ], callback); }; + +Categories.async = require('./promisify')(Categories); diff --git a/src/database/mongo.js b/src/database/mongo.js index 8c9cd8e0fa..99e045d9f4 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -118,7 +118,6 @@ mongoModule.init = function (callback) { } client = _client; db = client.db(); - mongoModule.client = db; require('./mongo/main')(db, mongoModule); @@ -127,6 +126,9 @@ mongoModule.init = function (callback) { require('./mongo/sorted')(db, mongoModule); require('./mongo/list')(db, mongoModule); require('./mongo/transaction')(db, mongoModule); + + mongoModule.async = require('../promisify')(mongoModule, ['client', 'sessionStore']); + callback(); }); }; diff --git a/src/database/postgres.js b/src/database/postgres.js index 8cd4f97d42..b8f4e4e90a 100644 --- a/src/database/postgres.js +++ b/src/database/postgres.js @@ -123,6 +123,8 @@ postgresModule.init = function (callback) { require('./postgres/list')(wrappedDB, postgresModule); require('./postgres/transaction')(db, dbNamespace, postgresModule); + postgresModule.async = require('../promisify')(postgresModule, ['client', 'sessionStore', 'pool']); + callback(); }); }); diff --git a/src/database/redis.js b/src/database/redis.js index 8186a950e2..6d780d0853 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -52,6 +52,8 @@ redisModule.init = function (callback) { require('./redis/list')(redisClient, redisModule); require('./redis/transaction')(redisClient, redisModule); + redisModule.async = require('../promisify')(redisModule, ['client', 'sessionStore']); + callback(); }); }; diff --git a/src/groups.js b/src/groups.js index 780eda46c4..9ac5cc8b85 100644 --- a/src/groups.js +++ b/src/groups.js @@ -301,3 +301,5 @@ Groups.existsBySlug = function (slug, callback) { db.isObjectField('groupslug:groupname', slug, callback); } }; + +Groups.async = require('./promisify')(Groups); diff --git a/src/messaging.js b/src/messaging.js index ba9e794b30..543d6d03a7 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -383,3 +383,5 @@ Messaging.hasPrivateChat = function (uid, withUid, callback) { }, ], callback); }; + +Messaging.async = require('./promisify')(Messaging); diff --git a/src/notifications.js b/src/notifications.js index 32adb67fe3..e45625e6e4 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -608,3 +608,5 @@ Notifications.merge = function (notifications, callback) { callback(err, data.notifications); }); }; + +Notifications.async = require('./promisify')(Notifications); diff --git a/src/posts.js b/src/posts.js index cd58d81527..080a143f94 100644 --- a/src/posts.js +++ b/src/posts.js @@ -321,3 +321,5 @@ Posts.modifyPostByPrivilege = function (post, privileges) { } } }; + +Posts.async = require('./promisify')(Posts); diff --git a/src/privileges.js b/src/privileges.js index 9ed1664ced..add204c029 100644 --- a/src/privileges.js +++ b/src/privileges.js @@ -49,3 +49,5 @@ require('./privileges/categories')(privileges); require('./privileges/topics')(privileges); require('./privileges/posts')(privileges); require('./privileges/users')(privileges); + +privileges.async = require('./promisify')(privileges); diff --git a/src/promisify.js b/src/promisify.js new file mode 100644 index 0000000000..9882cf2753 --- /dev/null +++ b/src/promisify.js @@ -0,0 +1,37 @@ +'use strict'; + +// remove once node 6 support is removed +require('util.promisify/shim')(); + +var util = require('util'); +var _ = require('lodash'); + +module.exports = function (theModule, ignoreKeys) { + ignoreKeys = ignoreKeys || []; + function isCallbackedFunction(func) { + if (typeof func !== 'function') { + return false; + } + var str = func.toString().split('\n')[0]; + return str.includes('callback)'); + } + function promisifyRecursive(module) { + if (!module) { + return; + } + var keys = Object.keys(module); + keys.forEach(function (key) { + if (ignoreKeys.includes(key)) { + return; + } + if (isCallbackedFunction(module[key])) { + module[key] = util.promisify(module[key]); + } else if (typeof module[key] === 'object') { + promisifyRecursive(module[key]); + } + }); + } + const asyncModule = _.cloneDeep(theModule); + promisifyRecursive(asyncModule); + return asyncModule; +}; diff --git a/src/topics.js b/src/topics.js index 5214b6a716..a67ad80097 100644 --- a/src/topics.js +++ b/src/topics.js @@ -368,3 +368,5 @@ Topics.search = function (tid, term, callback) { callback(err, Array.isArray(pids) ? pids : []); }); }; + +Topics.async = require('./promisify')(Topics); diff --git a/src/user.js b/src/user.js index 3b005d5572..72a0d1d74c 100644 --- a/src/user.js +++ b/src/user.js @@ -435,3 +435,4 @@ User.addInterstitials = function (callback) { callback(); }; +User.async = require('./promisify')(User); From 5b45b2f72c2d9cab6b57fc29a858c14b7a7aa4cf Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 31 Aug 2018 11:47:56 -0400 Subject: [PATCH 141/310] closes #6729 --- src/groups/membership.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/groups/membership.js b/src/groups/membership.js index 09e86e12f6..1f6cc7af14 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -105,7 +105,7 @@ module.exports = function (Groups) { return callback(err); } - user.setUserField(uid, 'groupTitle', groupName, callback); + user.setUserField(uid, 'groupTitle', JSON.stringify([groupName]), callback); }); } @@ -294,13 +294,17 @@ module.exports = function (Groups) { } async.waterfall([ function (next) { - db.getObjectField('user:' + uid, 'groupTitle', next); + user.getUserData(uid, next); }, - function (groupTitle, next) { - if (groupNames.includes(groupTitle)) { - db.deleteObjectField('user:' + uid, 'groupTitle', next); + function (userData, next) { + var newTitleArray = userData.groupTitleArray.filter(function (groupTitle) { + return !groupNames.includes(groupTitle); + }); + + if (newTitleArray.length) { + db.setObjectField('user:' + uid, 'groupTitle', JSON.stringify(newTitleArray), next); } else { - next(); + db.deleteObjectField('user:' + uid, 'groupTitle', next); } }, ], callback); From 29836aaad9110532d3d64c3c79191958530f8d23 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 31 Aug 2018 14:19:21 -0400 Subject: [PATCH 142/310] rename session account middleware to sessions, plural, prep for fixing #6678 --- src/controllers/accounts.js | 2 +- src/controllers/accounts/{session.js => sessions.js} | 0 src/routes/accounts.js | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/controllers/accounts/{session.js => sessions.js} (100%) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 0f31595ef4..8a8994e720 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -10,7 +10,7 @@ var accountsController = { posts: require('./accounts/posts'), notifications: require('./accounts/notifications'), chats: require('./accounts/chats'), - session: require('./accounts/session'), + sessions: require('./accounts/sessions'), blocks: require('./accounts/blocks'), uploads: require('./accounts/uploads'), consent: require('./accounts/consent'), diff --git a/src/controllers/accounts/session.js b/src/controllers/accounts/sessions.js similarity index 100% rename from src/controllers/accounts/session.js rename to src/controllers/accounts/sessions.js diff --git a/src/routes/accounts.js b/src/routes/accounts.js index 9febb67391..236a7e3682 100644 --- a/src/routes/accounts.js +++ b/src/routes/accounts.js @@ -34,7 +34,7 @@ module.exports = function (app, middleware, controllers) { setupPageRoute(app, '/user/:userslug/consent', middleware, accountMiddlewares, controllers.accounts.consent.get); setupPageRoute(app, '/user/:userslug/blocks', middleware, accountMiddlewares, controllers.accounts.blocks.getBlocks); - app.delete('/api/user/:userslug/session/:uuid', [middleware.exposeUid, middleware.ensureSelfOrGlobalPrivilege], controllers.accounts.session.revoke); + app.delete('/api/user/:userslug/session/:uuid', [middleware.exposeUid, middleware.ensureSelfOrGlobalPrivilege], controllers.accounts.sessions.revoke); setupPageRoute(app, '/notifications', middleware, [middleware.authenticate], controllers.accounts.notifications.get); setupPageRoute(app, '/user/:userslug/chats/:roomid?', middleware, middlewares, controllers.accounts.chats.get); From c2c925cacdfa63a4e70faf37c2734162409847af Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 31 Aug 2018 15:34:29 -0400 Subject: [PATCH 143/310] closes #6678 --- install/package.json | 4 +-- public/language/en-GB/pages.json | 1 + public/language/en-GB/user.json | 2 ++ public/src/client/account/info.js | 35 ++------------------- public/src/client/account/sessions.js | 44 +++++++++++++++++++++++++++ src/controllers/accounts/helpers.js | 11 +++++++ src/controllers/accounts/sessions.js | 30 ++++++++++++++++++ src/routes/accounts.js | 2 +- 8 files changed, 93 insertions(+), 36 deletions(-) create mode 100644 public/src/client/account/sessions.js diff --git a/install/package.json b/install/package.json index b07bef8fbd..22255a1e68 100644 --- a/install/package.json +++ b/install/package.json @@ -77,9 +77,9 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.28", + "nodebb-theme-persona": "9.0.29", "nodebb-theme-slick": "1.2.9", - "nodebb-theme-vanilla": "10.1.1", + "nodebb-theme-vanilla": "10.1.2", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", diff --git a/public/language/en-GB/pages.json b/public/language/en-GB/pages.json index f6927e63a2..a9db79d873 100644 --- a/public/language/en-GB/pages.json +++ b/public/language/en-GB/pages.json @@ -60,6 +60,7 @@ "account/best": "Best posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", + "account/sessions": "Login Sessions", "confirm": "Email Confirmed", diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index b971fc682c..0644beda99 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -169,6 +169,8 @@ "info.moderation-note.success": "Moderation note saved", "info.moderation-note.add": "Add note", + "sessions.description": "This page allows you to view any active sessions on this forum and revoke them if necessary. You can revoke your own session by logging out of your account.", + "consent.title": "Your Rights & Consent", "consent.lead": "This community forum collects and processes your personal information.", "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", diff --git a/public/src/client/account/info.js b/public/src/client/account/info.js index ee6648aab5..6e57439bff 100644 --- a/public/src/client/account/info.js +++ b/public/src/client/account/info.js @@ -1,13 +1,13 @@ 'use strict'; -define('forum/account/info', ['forum/account/header', 'components'], function (header, components) { +define('forum/account/info', ['forum/account/header', 'components', 'forum/account/sessions'], function (header, components, sessions) { var Info = {}; Info.init = function () { header.init(); handleModerationNote(); - prepareSessionRevoking(); + sessions.prepareSessionRevocation(); }; function handleModerationNote() { @@ -34,36 +34,5 @@ define('forum/account/info', ['forum/account/header', 'components'], function (h }); } - function prepareSessionRevoking() { - components.get('user/sessions').on('click', '[data-action]', function () { - var parentEl = $(this).parents('[data-uuid]'); - var uuid = parentEl.attr('data-uuid'); - - if (uuid) { - // This is done via DELETE because a user shouldn't be able to - // revoke his own session! This is what logout is for - $.ajax({ - url: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/session/' + uuid, - method: 'delete', - headers: { - 'x-csrf-token': config.csrf_token, - }, - }).done(function () { - parentEl.remove(); - }).fail(function (err) { - try { - var errorObj = JSON.parse(err.responseText); - if (errorObj.loggedIn === false) { - window.location.href = config.relative_path + '/login?error=' + errorObj.title; - } - app.alertError(errorObj.title); - } catch (e) { - app.alertError('[[error:invalid-data]]'); - } - }); - } - }); - } - return Info; }); diff --git a/public/src/client/account/sessions.js b/public/src/client/account/sessions.js new file mode 100644 index 0000000000..e4b44e98e3 --- /dev/null +++ b/public/src/client/account/sessions.js @@ -0,0 +1,44 @@ +'use strict'; + + +define('forum/account/sessions', ['forum/account/header', 'components'], function (header, components) { + var Sessions = {}; + + Sessions.init = function () { + header.init(); + Sessions.prepareSessionRevocation(); + }; + + Sessions.prepareSessionRevocation = function () { + components.get('user/sessions').on('click', '[data-action]', function () { + var parentEl = $(this).parents('[data-uuid]'); + var uuid = parentEl.attr('data-uuid'); + + if (uuid) { + // This is done via DELETE because a user shouldn't be able to + // revoke his own session! This is what logout is for + $.ajax({ + url: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/session/' + uuid, + method: 'delete', + headers: { + 'x-csrf-token': config.csrf_token, + }, + }).done(function () { + parentEl.remove(); + }).fail(function (err) { + try { + var errorObj = JSON.parse(err.responseText); + if (errorObj.loggedIn === false) { + window.location.href = config.relative_path + '/login?error=' + errorObj.title; + } + app.alertError(errorObj.title); + } catch (e) { + app.alertError('[[error:invalid-data]]'); + } + }); + } + }); + }; + + return Sessions; +}); diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 1d2a30272e..7272496cc8 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -65,6 +65,17 @@ helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) { globalMod: true, admin: true, }, + }, { + id: 'sessions', + route: 'sessions', + name: '[[pages:account/sessions]]', + visibility: { + self: true, + other: false, + moderator: false, + globalMod: true, + admin: true, + }, }, { id: 'consent', route: 'consent', diff --git a/src/controllers/accounts/sessions.js b/src/controllers/accounts/sessions.js index 809cdb6dad..df77a44dbc 100644 --- a/src/controllers/accounts/sessions.js +++ b/src/controllers/accounts/sessions.js @@ -4,9 +4,39 @@ var async = require('async'); var db = require('../../database'); var user = require('../../user'); +var helpers = require('../helpers'); +var accountHelpers = require('./helpers'); var sessionController = {}; +sessionController.get = function (req, res, callback) { + var userData; + + async.waterfall([ + function (next) { + accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, next); + }, + function (_userData, next) { + userData = _userData; + if (!userData) { + return callback(); + } + + async.parallel({ + sessions: async.apply(user.auth.getSessions, userData.uid, req.sessionID), + }, next); + }, + function (data) { + userData.sessions = data.sessions; + + userData.title = '[[pages:account/sessions]]'; + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[pages:account/sessions]]' }]); + + res.render('account/sessions', userData); + }, + ], callback); +}; + sessionController.revoke = function (req, res, next) { if (!req.params.hasOwnProperty('uuid')) { return next(); diff --git a/src/routes/accounts.js b/src/routes/accounts.js index 236a7e3682..61b5e6dd66 100644 --- a/src/routes/accounts.js +++ b/src/routes/accounts.js @@ -33,7 +33,7 @@ module.exports = function (app, middleware, controllers) { setupPageRoute(app, '/user/:userslug/uploads', middleware, accountMiddlewares, controllers.accounts.uploads.get); setupPageRoute(app, '/user/:userslug/consent', middleware, accountMiddlewares, controllers.accounts.consent.get); setupPageRoute(app, '/user/:userslug/blocks', middleware, accountMiddlewares, controllers.accounts.blocks.getBlocks); - + setupPageRoute(app, '/user/:userslug/sessions', middleware, accountMiddlewares, controllers.accounts.sessions.get); app.delete('/api/user/:userslug/session/:uuid', [middleware.exposeUid, middleware.ensureSelfOrGlobalPrivilege], controllers.accounts.sessions.revoke); setupPageRoute(app, '/notifications', middleware, [middleware.authenticate], controllers.accounts.notifications.get); From cc532d2c8b169d3c4211c816cd57e479908bf14a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 31 Aug 2018 16:04:51 -0400 Subject: [PATCH 144/310] bump persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 22255a1e68..b706907bab 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.29", + "nodebb-theme-persona": "9.0.30", "nodebb-theme-slick": "1.2.9", "nodebb-theme-vanilla": "10.1.2", "nodebb-widget-essentials": "4.0.7", From 97a3079bc0bdf1b86396b3ec03995ce95dee6050 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sat, 1 Sep 2018 13:32:30 -0500 Subject: [PATCH 145/310] Optimize PostgreSQL session store. - Sets session ID to be a constant-sized character field inline in the table instead of a variable-length character field compressed outside of the row. - Changes the session data from "json" to "jsonb" which is faster and smaller on disk with the drawback of not maintaining key order and whitespace (which we don't care about at all) - Adds a clustered index on the session expiration timestamp, which will make periodic session purging much faster. (For an example, WTDWTF currently has 482355 sessions in the table, and because there is no index on the expiration timestamp, PostgreSQL must check all the rows in the table every time.) This upgrade script can run concurrently with a live NodeBB instance, but any action that touches sessions will wait until the upgrade script is done. Does not touch the database if the database driver is not set to PostgreSQL or if there is a Redis database configured. --- src/database/postgres.js | 21 ++++++------ src/upgrades/1.10.2/postgres_sessions.js | 41 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 src/upgrades/1.10.2/postgres_sessions.js diff --git a/src/database/postgres.js b/src/database/postgres.js index b8f4e4e90a..df1ccf8784 100644 --- a/src/database/postgres.js +++ b/src/database/postgres.js @@ -366,15 +366,18 @@ postgresModule.initSessionStore = function (callback) { db.query(` CREATE TABLE IF NOT EXISTS "session" ( - "sid" VARCHAR NOT NULL - COLLATE "default", - "sess" JSON NOT NULL, - "expire" TIMESTAMP(6) NOT NULL, - CONSTRAINT "session_pkey" - PRIMARY KEY ("sid") - NOT DEFERRABLE - INITIALLY IMMEDIATE -) WITH (OIDS=FALSE)`, function (err) { + "sid" CHAR(32) NOT NULL + COLLATE "C" + PRIMARY KEY, + "sess" JSONB NOT NULL, + "expire" TIMESTAMPTZ NOT NULL +) WITHOUT OIDS; + +CREATE INDEX IF NOT EXISTS "session_expire_idx" ON "session"("expire"); + +ALTER TABLE "session" + ALTER "sid" SET STORAGE MAIN, + CLUSTER ON "session_expire_idx";`, function (err) { if (err) { return callback(err); } diff --git a/src/upgrades/1.10.2/postgres_sessions.js b/src/upgrades/1.10.2/postgres_sessions.js new file mode 100644 index 0000000000..b77a3f9b92 --- /dev/null +++ b/src/upgrades/1.10.2/postgres_sessions.js @@ -0,0 +1,41 @@ +'use strict'; + +var db = require('../../database'); +var nconf = require('nconf'); + +module.exports = { + name: 'Optimize PostgreSQL sessions', + timestamp: Date.UTC(2018, 9, 1), + method: function (callback) { + if (nconf.get('database') !== 'postgres' || nconf.get('redis')) { + return callback(); + } + + db.pool.query(` +BEGIN TRANSACTION; + +CREATE TABLE IF NOT EXISTS "session" ( + "sid" CHAR(32) NOT NULL + COLLATE "C" + PRIMARY KEY, + "sess" JSONB NOT NULL, + "expire" TIMESTAMPTZ NOT NULL +) WITHOUT OIDS; + +CREATE INDEX IF NOT EXISTS "session_expire_idx" ON "session"("expire"); + +ALTER TABLE "session" + ALTER "sid" TYPE CHAR(32) COLLATE "C", + ALTER "sid" SET STORAGE PLAIN, + ALTER "sess" TYPE JSONB, + ALTER "expire" TYPE TIMESTAMPTZ, + CLUSTER ON "session_expire_idx"; + +CLUSTER "session"; +ANALYZE "session"; + +COMMIT;`, function (err) { + callback(err); + }); + }, +}; From 13044df14e9b1f1fad5af4f7a655230e876657e9 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 3 Sep 2018 09:31:54 +0000 Subject: [PATCH 146/310] Latest translations and fallbacks --- public/language/lv/error.json | 4 ++-- public/language/lv/global.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/language/lv/error.json b/public/language/lv/error.json index cc2d8b4177..d9e9cd8e79 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -17,7 +17,7 @@ "invalid-login-credentials": "Nederīgi pieteikšanās dati", "invalid-username-or-password": "Lūdzu, norādi gan lietotājvārdu, gan paroli", "invalid-search-term": "Nederīga meklēšanas frāze", - "invalid-url": "Nederīgs URL\n", + "invalid-url": "Nederīga saite\n", "local-login-disabled": "Pieteikšanās sistēma ir atspējota nepriviliģētiem kontiem.", "csrf-invalid": "Mēs nevarējām Tevi pierakstīt, iespējams, beigušās tiešsaistes sesijas dēļ. Lūdzu, mēģini vēlreiz", "invalid-pagination-value": "Nederīga numerācijas vērtība, ir jābūt vismaz %1 un ne vairāk kā %2", @@ -78,7 +78,7 @@ "still-uploading": "Lūdzu, uzgaidi, līdz augšupielādes beidzas.", "file-too-big": "Lielākais atļauto faila lielums ir %1 kB - lūdzu, augšupielādē mazāku failu", "guest-upload-disabled": "Viesu failu augšupielāde ir atspējota", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Neizdevās augšupielādēt bildi nepareizo CORS iestatījumu dēļ", "already-bookmarked": "Tu jau esi atzīmējis šo ziņu ar grāmatzīmi", "already-unbookmarked": "Tu jau esi noņēmis grāmatzīmi no šīs ziņas", "cant-ban-other-admins": "Tu nevari bloķēt citus administratorus!", diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 5b2e035540..21eebf735d 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -85,7 +85,7 @@ "language": "Valoda", "guest": "Viesis", "guests": "Viesi", - "former_user": "A Former User", + "former_user": "Bijušais lietotājs", "updated.title": "Forums ir atjaunināts", "updated.message": "Forums tikko tika atjaunināts līdz jaunākajai versijai. Noklikšķini šeit, lai atsvaidzinātu lapu.", "privacy": "Privātums", From f51b2e07f422538ba49d267318b8e33b78de1091 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Mon, 3 Sep 2018 15:27:33 -0400 Subject: [PATCH 147/310] Update dependency jimp to v0.4.0 (#6682) --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b706907bab..89bb69fe79 100644 --- a/install/package.json +++ b/install/package.json @@ -51,7 +51,7 @@ "helmet": "^3.11.0", "html-to-text": "^4.0.0", "ipaddr.js": "^1.5.4", - "jimp": "0.2.28", + "jimp": "0.4.0", "jquery": "^3.2.1", "jsesc": "2.5.1", "json-2-csv": "^2.1.2", From 3e1b007f9f05ddaa9ea2b224d4c772ef4bb066f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 4 Sep 2018 09:39:08 -0400 Subject: [PATCH 148/310] escape title in post queue --- src/controllers/admin/postqueue.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/admin/postqueue.js b/src/controllers/admin/postqueue.js index 66ce1e237f..0105445a90 100644 --- a/src/controllers/admin/postqueue.js +++ b/src/controllers/admin/postqueue.js @@ -1,6 +1,7 @@ 'use strict'; var async = require('async'); +var validator = require('validator'); var db = require('../../database'); var user = require('../../user'); @@ -81,6 +82,7 @@ function getQueuedPosts(ids, callback) { async.map(postData, function (postData, next) { postData.data.rawContent = postData.data.content; + postData.data.title = validator.escape(String(postData.data.title)); async.waterfall([ function (next) { if (postData.data.cid) { From c7f3b76b4e2e12f3596c8871c440e9715dfcf3e3 Mon Sep 17 00:00:00 2001 From: LudwikJaniuk Date: Tue, 4 Sep 2018 15:43:33 +0200 Subject: [PATCH 149/310] DRY req props that depend on auth (fix #6727) (#6731) * DRY req props that depend on auth (fix #6727) authentication leads to req.loggedIn and req.uid being set. However, a later authentication event might outdate them. Here, I create one function for setting those properties, and make sure it also is called on the `action:middleware.authenticate` hook, which would be such an authentication event. If there are other places, those should be added as well. * fix lint errors * fix lint error * change exports --- src/controllers/groups.js | 4 +--- src/middleware/user.js | 6 +++++- src/routes/authentication.js | 26 ++++++++++++++------------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 0703915e6f..30dd604c56 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -8,7 +8,7 @@ var groups = require('../groups'); var user = require('../user'); var helpers = require('./helpers'); -var groupsController = {}; +var groupsController = module.exports; groupsController.list = function (req, res, next) { var sort = req.query.sort || 'alpha'; @@ -177,5 +177,3 @@ groupsController.uploadCover = function (req, res, next) { res.json([{ url: image.url }]); }); }; - -module.exports = groupsController; diff --git a/src/middleware/user.js b/src/middleware/user.js index 17c52e7ca6..10983cb4f6 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -8,6 +8,8 @@ var user = require('../user'); var privileges = require('../privileges'); var plugins = require('../plugins'); +var auth = require('../routes/authentication'); + var controllers = { helpers: require('../controllers/helpers'), }; @@ -22,7 +24,9 @@ module.exports = function (middleware) { return plugins.fireHook('action:middleware.authenticate', { req: req, res: res, - next: next, + next: function (err) { + auth.setAuthVars(req, res, function () { next(err); }); + }, }); } diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 986cc31ed7..ccb3e316e0 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -19,23 +19,25 @@ Auth.initialize = function (app, middleware) { app.use(passport.initialize()); app.use(passport.session()); - app.use(function (req, res, next) { - var isSpider = req.isSpider(); - req.loggedIn = !isSpider && !!req.user; - if (isSpider) { - req.uid = -1; - } else if (req.user) { - req.uid = parseInt(req.user.uid, 10); - } else { - req.uid = 0; - } - next(); - }); + app.use(Auth.setAuthVars); Auth.app = app; Auth.middleware = middleware; }; +Auth.setAuthVars = function (req, res, next) { + var isSpider = req.isSpider(); + req.loggedIn = !isSpider && !!req.user; + if (isSpider) { + req.uid = -1; + } else if (req.user) { + req.uid = parseInt(req.user.uid, 10); + } else { + req.uid = 0; + } + next(); +}; + Auth.getLoginStrategies = function () { return loginStrategies; }; From 446b125c835dc508553a9aab89d0d33a6affdac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 4 Sep 2018 10:59:48 -0400 Subject: [PATCH 150/310] escape post content --- src/controllers/admin/postqueue.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/admin/postqueue.js b/src/controllers/admin/postqueue.js index 0105445a90..1812d70e95 100644 --- a/src/controllers/admin/postqueue.js +++ b/src/controllers/admin/postqueue.js @@ -81,7 +81,7 @@ function getQueuedPosts(ids, callback) { }); async.map(postData, function (postData, next) { - postData.data.rawContent = postData.data.content; + postData.data.rawContent = validator.escape(String(postData.data.content)); postData.data.title = validator.escape(String(postData.data.title)); async.waterfall([ function (next) { From 65497b18fa2d513c2ddad2a14b2dfceeb38130f0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 Sep 2018 12:54:03 +0000 Subject: [PATCH 151/310] Update dependency validator to v10.7.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 89bb69fe79..a5d0baac99 100644 --- a/install/package.json +++ b/install/package.json @@ -110,7 +110,7 @@ "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", "util.promisify": "1.0.0", - "validator": "10.7.0", + "validator": "10.7.1", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "^4.1.1", From 3175d58dc0934b45ab94de8a9ca4c371a52ab933 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 1 Sep 2018 04:21:57 +0000 Subject: [PATCH 152/310] Update dependency eslint to v5.5.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index a5d0baac99..ca0e7c3473 100644 --- a/install/package.json +++ b/install/package.json @@ -118,7 +118,7 @@ }, "devDependencies": { "coveralls": "3.0.2", - "eslint": "5.4.0", + "eslint": "5.5.0", "eslint-config-airbnb-base": "12.1.0", "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", From a3cb7dc68a71da68915cfa9a371d0f3ce5ddd2ba Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 27 Aug 2018 19:49:13 +0000 Subject: [PATCH 153/310] Update dependency nyc to v13 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ca0e7c3473..9053f851e5 100644 --- a/install/package.json +++ b/install/package.json @@ -126,7 +126,7 @@ "jsdom": "12.0.0", "mocha": "5.2.0", "mocha-lcov-reporter": "1.3.0", - "nyc": "12.0.2", + "nyc": "13.0.1", "smtp-server": "3.4.7" }, "bugs": { From 59fd27510a7fd96b63742cb1e772873b790d94dc Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 5 Sep 2018 09:32:04 +0000 Subject: [PATCH 154/310] Latest translations and fallbacks --- .../lv/admin/manage/ip-blacklist.json | 8 ++--- .../language/lv/admin/manage/post-queue.json | 2 +- .../language/lv/admin/manage/privileges.json | 4 +-- .../lv/admin/manage/registration.json | 2 +- public/language/lv/admin/manage/users.json | 32 +++++++++---------- public/language/lv/admin/menu.json | 4 +-- public/language/lv/admin/settings/post.json | 4 +-- public/language/lv/email.json | 8 ++--- public/language/lv/error.json | 2 +- public/language/lv/global.json | 4 +-- public/language/lv/notifications.json | 2 +- public/language/lv/pages.json | 28 ++++++++-------- public/language/lv/success.json | 2 +- public/language/lv/topic.json | 6 ++-- public/language/lv/user.json | 22 ++++++------- public/language/lv/users.json | 2 +- 16 files changed, 66 insertions(+), 66 deletions(-) diff --git a/public/language/lv/admin/manage/ip-blacklist.json b/public/language/lv/admin/manage/ip-blacklist.json index 588fbd62b6..88e5ea7db5 100644 --- a/public/language/lv/admin/manage/ip-blacklist.json +++ b/public/language/lv/admin/manage/ip-blacklist.json @@ -1,8 +1,8 @@ { - "lead": "Configure your IP blacklist here.", - "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", + "lead": "Iestatīt savu IP adrešu melno sarakstu šeit.", + "description": "Reizēm lietotāja konta bloķēšana nav pietiekošs preventīvs līdzeklis. Citā gadījumā labākais veids, kā aizsargāt forumu, ir ierobežot piekļuvi forumam konkrētai IP adresei vai vairākām IP adresēm. Šajos scenārijos varat ievietot traucējošas IP adreses vai visus CIDR blokus šajā melnajā sarakstā, un no viņām neļaus pierakstīties vai reģistrēt jaunu kontu.", "active-rules": "Active Rules", - "validate": "Validate Blacklist", + "validate": "Apstiprināt melno sarakstu", "apply": "Apply Blacklist", "hints": "Syntax Hints", "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", @@ -15,5 +15,5 @@ "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day", - "ip-banned": "IP banned" + "ip-banned": "IP adrese bloķēta" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/post-queue.json b/public/language/lv/admin/manage/post-queue.json index 4de24c991b..21a9fdbada 100644 --- a/public/language/lv/admin/manage/post-queue.json +++ b/public/language/lv/admin/manage/post-queue.json @@ -1,5 +1,5 @@ { - "post-queue": "Post Queue", + "post-queue": "Ziņu rinda", "description": "There are no posts in the post queue.
To enable this feature, go to Settings → Post → Posting Restrictions and enable Post Queue.", "user": "User", "category": "Category", diff --git a/public/language/lv/admin/manage/privileges.json b/public/language/lv/admin/manage/privileges.json index 0de8ea489f..83a7452a5d 100644 --- a/public/language/lv/admin/manage/privileges.json +++ b/public/language/lv/admin/manage/privileges.json @@ -6,7 +6,7 @@ "upload-images": "Upload Images", "upload-files": "Upload Files", "signature": "Signature", - "ban": "Ban", + "ban": "Bloķēt", "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", @@ -22,7 +22,7 @@ "delete-posts": "Delete Posts", "view_deleted": "View Deleted Posts", "upvote-posts": "Ziņas, kurām ir balsis par", - "downvote-posts": "Downvote Posts", + "downvote-posts": "Ziņas, kurām ir balsis pret", "delete-topics": "Delete Topics", "purge": "Purge", "moderate": "Moderate" diff --git a/public/language/lv/admin/manage/registration.json b/public/language/lv/admin/manage/registration.json index f9c7c84b59..e49eff8432 100644 --- a/public/language/lv/admin/manage/registration.json +++ b/public/language/lv/admin/manage/registration.json @@ -1,5 +1,5 @@ { - "queue": "Queue", + "queue": "Ievietot rindā", "description": "There are no users in the registration queue.
To enable this feature, go to Settings → User → User Registration and set Registration Type to \"Admin Approval\".", "list.name": "Name", diff --git a/public/language/lv/admin/manage/users.json b/public/language/lv/admin/manage/users.json index cd07447923..1f50ab3782 100644 --- a/public/language/lv/admin/manage/users.json +++ b/public/language/lv/admin/manage/users.json @@ -6,11 +6,11 @@ "validate-email": "Validate Email", "send-validation-email": "Send Validation Email", "password-reset-email": "Send Password Reset Email", - "ban": "Ban User(s)", - "temp-ban": "Ban User(s) Temporarily", - "unban": "Unban User(s)", + "ban": "Bloķēt lietotāju(-s)", + "temp-ban": "Bloķēt lietotāju(-s) uz laiku", + "unban": "Atbloķēt lietotāju(-s)", "reset-lockout": "Reset Lockout", - "reset-flags": "Reset Flags", + "reset-flags": "Atiestatīt atzīmes", "delete": "Delete User(s)", "purge": "Delete User(s) and Content", "download-csv": "Download CSV", @@ -23,8 +23,8 @@ "pills.top-posters": "Top Posters", "pills.top-rep": "Most Reputation", "pills.inactive": "Inactive", - "pills.flagged": "Most Flagged", - "pills.banned": "Banned", + "pills.flagged": "Visvairāk atzīmēto", + "pills.banned": "Bloķētie", "pills.search": "User Search", "search.uid": "By User ID", @@ -46,10 +46,10 @@ "users.email": "email", "users.postcount": "postcount", "users.reputation": "reputation", - "users.flags": "flags", + "users.flags": "atzīmes", "users.joined": "joined", "users.last-online": "last online", - "users.banned": "banned", + "users.banned": "bloķētie", "create.username": "User Name", "create.email": "Email", @@ -57,19 +57,19 @@ "create.password": "Password", "create.password-confirm": "Confirm Password", - "temp-ban.length": "Ban Length", + "temp-ban.length": "Bloķēšanas termiņš", "temp-ban.reason": "Reason (Optional)", "temp-ban.hours": "Hours", "temp-ban.days": "Days", - "temp-ban.explanation": "Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban.", + "temp-ban.explanation": "Ievadi bloķēšanas termiņu. Ņemi vērā, ka 0 tiks uzskatīts par pastāvīgu bloķēšanu.", - "alerts.confirm-ban": "Do you really want to ban this user permanently?", - "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", - "alerts.ban-success": "User(s) banned!", - "alerts.button-ban-x": "Ban %1 user(s)", - "alerts.unban-success": "User(s) unbanned!", + "alerts.confirm-ban": "Vai tiešām vēlies pastāvīgi bloķēt šo lietotāju?", + "alerts.confirm-ban-multi": "Vai tiešām vēlies pastāvīgi bloķēt šos lietotājus?", + "alerts.ban-success": "Lietotājs(-i) bloķēts(-i)!", + "alerts.button-ban-x": "Bloķēt %1 lietotāju(-s)", + "alerts.unban-success": "Lietotājs(-i) atbloķēts(-i)", "alerts.lockout-reset-success": "Lockout(s) reset!", - "alerts.flag-reset-success": "Flags(s) reset!", + "alerts.flag-reset-success": "Atzīme(-s) atiestīta(-s)!", "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", "alerts.make-admin-success": "User is now administrator.", "alerts.confirm-remove-admin": "Do you really want to remove this administrator?", diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index 2d8213927a..d425b099e7 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -14,9 +14,9 @@ "manage/users": "Users", "manage/admins-mods": "Admins & Mods", "manage/registration": "Reģistrāciju rinda", - "manage/post-queue": "Post Queue", + "manage/post-queue": "Ziņu rinda", "manage/groups": "Groups", - "manage/ip-blacklist": "IP Blacklist", + "manage/ip-blacklist": "IP adrešu melnais saraksts", "manage/uploads": "Uploads", "section-settings": "Settings", diff --git a/public/language/lv/admin/settings/post.json b/public/language/lv/admin/settings/post.json index b0baded53b..fa11f5ae79 100644 --- a/public/language/lv/admin/settings/post.json +++ b/public/language/lv/admin/settings/post.json @@ -3,13 +3,13 @@ "sorting.post-default": "Default Post Sorting", "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", - "sorting.most-votes": "Most Votes", + "sorting.most-votes": "Visvairāk balsu", "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.post-queue": "Iespējot ziņu rindu", "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-new.post-queue-help": "Enabling new user restrictions will set restrictions on posts created by new users.", diff --git a/public/language/lv/email.json b/public/language/lv/email.json index 6aa16f86f3..fb3ac8f0a7 100644 --- a/public/language/lv/email.json +++ b/public/language/lv/email.json @@ -36,9 +36,9 @@ "notif.cta": "Noklikšķini, lai dotos uz forumu", "test.text1": "Šis ir e-pasts, lai pārbaudītu, vai e-pasta sūtītājs ir pareizi iestatīts Tavā NodeBB.", "unsub.cta": "Noklikšķini, lai mainītu šos iestatījumus", - "banned.subject": "Tev ir aizliegts %1", - "banned.text1": "Lietotājs %1 ir aizliegts no %2.", - "banned.text2": "Aizliegums ilgs līdz %1.", - "banned.text3": "Šis ir iemesls, kāpēc Tu esi aizliegts:", + "banned.subject": "Tu esi bloķēts no %1", + "banned.text1": "Lietotājs %1 ir bloķēts no %2.", + "banned.text2": "Bloķēšana ilgs līdz %1.", + "banned.text3": "Šis ir iemesls, kāpēc Tu esi bloķēts:", "closing": "Paldies!" } \ No newline at end of file diff --git a/public/language/lv/error.json b/public/language/lv/error.json index d9e9cd8e79..123e087b7f 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -38,7 +38,7 @@ "user-banned-reason-until": "Diemžēl šis konts ir bloķēts līdz %1 (Iemesls: %2)", "user-too-new": "Atvaino, pirms pirmās ziņas izveides Tev jāgaida %1 sekundes", "blacklisted-ip": "Diemžēl Tava IP adrese ir bloķēta šajā kopienā. Ja Tev liekas, ka esam kļūdījušies, lūdzu, sazinies ar administratoru.", - "ban-expiry-missing": "Lūdzu, norādi šā aizlieguma beigu datumu", + "ban-expiry-missing": "Lūdzu, norādi šīs bloķēšanas beigu datumu", "no-category": "Kategorija nav atrasta", "no-topic": "Temats nav atrasts", "no-post": "Ziņa nav atrasta", diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 21eebf735d..887346cb10 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -44,8 +44,8 @@ "nextpage": "Nākamā lapa", "alert.success": "Veiksme", "alert.error": "Kļūda", - "alert.banned": "Aizliegts", - "alert.banned.message": "Tu tikko esi bijis aizliegts, Tu tagad izrakstīsies.", + "alert.banned": "Bloķētie", + "alert.banned.message": "Tu tikko esi bijis bloķēts, Tu tagad izrakstīsies.", "alert.unfollow": "Tu vairs neseko %1!", "alert.follow": "Tu tagad seko %1!", "online": "Tiešsaistē", diff --git a/public/language/lv/notifications.json b/public/language/lv/notifications.json index 81a7c86789..44b9b81d7a 100644 --- a/public/language/lv/notifications.json +++ b/public/language/lv/notifications.json @@ -19,7 +19,7 @@ "upvote": "Balsis par", "new-flags": "Jaunās atzīmes", "my-flags": "Atzīmes piešķirtas man", - "bans": "Aizliegumi", + "bans": "Bloķēšanas", "new_message_from": "Jauna ziņa no %1", "upvoted_your_post_in": "%1 ir balsojis par Tavu ziņu %2.", "upvoted_your_post_in_dual": "%1 un %2 ir balsojuši par Tavu ziņu %3.", diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 4bf7667d4d..412fd692b7 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -6,20 +6,20 @@ "popular-month": "Populārās tēmas šajā mēnesī", "popular-alltime": "Visu laiku populārās tēmas", "recent": "Nesenās tēmas", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", - "moderator-tools": "Moderator Tools", - "flagged-content": "Flagged Content", - "ip-blacklist": "IP Blacklist", - "post-queue": "Post Queue", + "top-day": "Visvairāk balsotie temati šodien", + "top-week": "Visvairāk balsotie temati šonedēļ", + "top-month": "Visvairāk balsotie temati šajā mēnesī", + "top-alltime": "Visvairāk balsotie temati", + "moderator-tools": "Moderatora rīki", + "flagged-content": "Atzīmētais saturs", + "ip-blacklist": "IP adrešu melnais saraksts", + "post-queue": "Ziņu rinda", "users/online": "Online Users", "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", + "users/sort-posts": "Lietotāji ar visvairāk ziņu", "users/sort-reputation": "Users with the most reputation", - "users/banned": "Banned Users", - "users/most-flags": "Most flagged users", + "users/banned": "Bloķētie lietotāji", + "users/most-flags": "Visvairāk atzīmēto lietotāju", "users/search": "User Search", "notifications": "Notifications", "tags": "Tags", @@ -33,8 +33,8 @@ "group": "%1 group", "chats": "Sarunas", "chat": "Sarunājās ar %1", - "flags": "Flags", - "flag-details": "Flag %1 Details", + "flags": "Atzīmes", + "flag-details": "Atzīmes %1 informācija", "account/edit": "Editing \"%1\"", "account/edit/password": "Editing password of \"%1\"", "account/edit/username": "Editing username of \"%1\"", @@ -50,7 +50,7 @@ "account/watched": "Topics watched by %1", "account/ignored": "Topics ignored by %1", "account/upvoted": "Ziņas, kurām %1 balsoja par", - "account/downvoted": "Posts downvoted by %1", + "account/downvoted": "Ziņas, kurām %1 balsoja pret", "account/best": "Best posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", diff --git a/public/language/lv/success.json b/public/language/lv/success.json index 73094d2888..5345e0a3b9 100644 --- a/public/language/lv/success.json +++ b/public/language/lv/success.json @@ -1,7 +1,7 @@ { "success": "Success", "topic-post": "You have successfully posted.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Tava ziņa ir rindā apstiprināšanai.", "authentication-successful": "Authentication Successful", "settings-saved": "Iestatījumi saglabāti!" } \ No newline at end of file diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json index a4c915556e..83336adb02 100644 --- a/public/language/lv/topic.json +++ b/public/language/lv/topic.json @@ -31,10 +31,10 @@ "pinned": "Pinned", "moved": "Moved", "copy-ip": "Copy IP", - "ban-ip": "Ban IP", + "ban-ip": "Bloķēt IP adresi", "view-history": "Edit History", "bookmark_instructions": "Click here to return to the last read post in this thread.", - "flag_title": "Flag this post for moderation", + "flag_title": "Atzīmēt šo ziņu moderācijai", "merged_message": "This topic has been merged into %2", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", @@ -118,7 +118,7 @@ "sort_by": "Sort by", "oldest_to_newest": "Oldest to Newest", "newest_to_oldest": "Newest to Oldest", - "most_votes": "Most Votes", + "most_votes": "Visvairāk balsu", "most_posts": "Most Posts", "stale.title": "Tā vietā izveidot jaunu tematu?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 0d433aef57..a1cea145ba 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -1,5 +1,5 @@ { - "banned": "Banned", + "banned": "Bloķētie", "offline": "Offline", "deleted": "Deleted", "username": "User Name", @@ -8,9 +8,9 @@ "email": "Email", "confirm_email": "Confirm Email", "account_info": "Account Info", - "ban_account": "Ban Account", - "ban_account_confirm": "Do you really want to ban this user?", - "unban_account": "Unban Account", + "ban_account": "Bloķēt kontu", + "ban_account_confirm": "Vai tiešām vēlies bloķēt šo lietotāju?", + "unban_account": "Atbloķēt kontu", "delete_account": "Delete Account", "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your password to confirm that you wish to destroy this account.", "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

", @@ -39,7 +39,7 @@ "chat": "Sarunāties", "chat_with": "Turpināt sarunu ar %1", "new_chat_with": "Sākt jaunu sarunu ar %1", - "flag-profile": "Flag Profile", + "flag-profile": "Atzīmēt profilu", "follow": "Sekot", "unfollow": "Pārtraukt sekot", "more": "More", @@ -137,12 +137,12 @@ "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.latest-flags": "Jaunākās atzīmes", + "info.no-flags": "Nav atzīmēto ziņu", + "info.ban-history": "Nesenā bloķēšanas vēsture", + "info.no-ban-history": "Šis lietotājs nekad nav bijis bloķēts", + "info.banned-until": "Bloķēts līdz %1", + "info.banned-permanently": "Bloķēts pastāvīgi", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", "info.username-history": "Username History", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index 4a9e92fb86..b5150b0ea2 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -2,7 +2,7 @@ "latest_users": "Latest Users", "top_posters": "Top Posters", "most_reputation": "Most Reputation", - "most_flags": "Most Flags", + "most_flags": "Visvairāk atzīmju", "search": "Search", "enter_username": "Enter a username to search", "load_more": "Load More", From bd0983c6a1b5710ebcae2901481fa29ce9d40977 Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Wed, 5 Sep 2018 13:13:39 -0400 Subject: [PATCH 155/310] add postgres to issue template --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index d025ff3ff5..27c7ace0a9 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -10,7 +10,7 @@ - **NodeBB version:** - **NodeBB git hash:** -- **Database type:** mongo or redis +- **Database type:** mongo, redis, or postgres - **Database version:** - **Exact steps to cause this issue:** From 6f18cf368b671d6112d1e7feede8cb1e6bf53ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 5 Sep 2018 14:02:59 -0400 Subject: [PATCH 156/310] closes #6741 --- src/topics/teaser.js | 54 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/topics/teaser.js b/src/topics/teaser.js index 57721cd916..3cc10185af 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -61,7 +61,7 @@ module.exports = function (Topics) { _postData = _postData.filter(function (post) { return post && parseInt(post.pid, 10); }); - user.blocks.filter(uid, _postData, next); + handleBlocks(uid, _postData, next); }, function (_postData, next) { postData = _postData; @@ -77,7 +77,6 @@ module.exports = function (Topics) { users[user.uid] = user; }); - async.each(postData, function (post, next) { // If the post author isn't represented in the retrieved users' data, then it means they were deleted, assume guest. if (!users.hasOwnProperty(post.uid)) { @@ -112,6 +111,57 @@ module.exports = function (Topics) { ], callback); }; + function handleBlocks(uid, teasers, callback) { + async.mapSeries(teasers, function (postData, nextPost) { + async.waterfall([ + function (next) { + user.blocks.is(postData.uid, uid, next); + }, + function (isBlocked, next) { + if (!isBlocked) { + return nextPost(null, postData); + } + getPreviousNonBlockedPost(postData, uid, next); + }, + ], nextPost); + }, callback); + } + + function getPreviousNonBlockedPost(postData, uid, callback) { + let isBlocked = false; + let prevPost = postData; + Topics.getPids(postData.tid, function (err, pids) { + if (err) { + return callback(err); + } + + async.doWhilst(function (next) { + async.waterfall([ + function (next) { + const index = pids.lastIndexOf(String(prevPost.pid)); + if (index <= 0) { + return callback(null, null); + } + + posts.getPostFields(pids[index - 1], ['pid', 'uid', 'timestamp', 'tid', 'content'], next); + }, + function (_prevPost, next) { + prevPost = _prevPost; + user.blocks.is(prevPost.uid, uid, next); + }, + function (_isBlocked, next) { + isBlocked = _isBlocked; + next(); + }, + ], next); + }, function () { + return isBlocked && prevPost && prevPost.pid; + }, function (err) { + callback(err, prevPost); + }); + }); + } + Topics.getTeasersByTids = function (tids, uid, callback) { if (typeof uid === 'function') { winston.warn('[Topics.getTeasersByTids] this usage is deprecated please provide uid'); From 84a0a68b2b48822e69006da05dbc0b4e79de66f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 5 Sep 2018 17:02:41 -0400 Subject: [PATCH 157/310] up vanilla --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9053f851e5..a8dcb2aa25 100644 --- a/install/package.json +++ b/install/package.json @@ -79,7 +79,7 @@ "nodebb-theme-lavender": "5.0.7", "nodebb-theme-persona": "9.0.30", "nodebb-theme-slick": "1.2.9", - "nodebb-theme-vanilla": "10.1.2", + "nodebb-theme-vanilla": "10.1.3", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From 25fed0aa8d377e5ff84fa09e5cec28efd0f4dd53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Sep 2018 14:32:44 -0400 Subject: [PATCH 158/310] change isPasswordCorrect to return false if user does not have password --- src/socket.io/user.js | 6 ++++++ src/user/password.js | 22 ++++++++-------------- test/authentication.js | 13 +++++++++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 2df4cfa612..ece95c875e 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -37,6 +37,12 @@ SocketUser.deleteAccount = function (socket, data, callback) { async.waterfall([ function (next) { + user.hasPassword(socket.uid, next); + }, + function (hasPassword, next) { + if (!hasPassword) { + return next(); + } user.isPasswordCorrect(socket.uid, data.password, socket.ip, function (err, ok) { next(err || (!ok ? new Error('[[error:invalid-password]]') : undefined)); }); diff --git a/src/user/password.js b/src/user/password.js index 78dc61cec4..bfb65f9cb3 100644 --- a/src/user/password.js +++ b/src/user/password.js @@ -24,9 +24,7 @@ module.exports = function (User) { }, function (_hashedPassword, next) { hashedPassword = _hashedPassword; - if (uid && !hashedPassword) { - return callback(null, true); - } else if (!hashedPassword) { + if (!hashedPassword) { // Non-existant user, submit fake hash for comparison hashedPassword = ''; } @@ -37,17 +35,13 @@ module.exports = function (User) { function (next) { Password.compare(password, hashedPassword, next); }, - ], function (err, ok) { - if (err) { - return callback(err); - } - - if (ok) { - User.auth.clearLoginAttempts(uid); - } - - callback(null, ok); - }); + function (ok, next) { + if (ok) { + User.auth.clearLoginAttempts(uid); + } + next(null, ok); + }, + ], callback); }; User.hasPassword = function (uid, callback) { diff --git a/test/authentication.js b/test/authentication.js index b90d585971..650fcac74b 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -303,6 +303,19 @@ describe('authentication', function () { }); }); + it('should fail to login if user does not have password field in db', function (done) { + user.create({ username: 'hasnopassword', email: 'no@pass.org' }, function (err, uid) { + assert.ifError(err); + loginUser('hasnopassword', 'doesntmatter', function (err, response, body) { + assert.ifError(err); + console.log(response.statusCode, body); + assert.equal(response.statusCode, 403); + assert.equal(body, '[[error:invalid-login-credentials]]'); + done(); + }); + }); + }); + it('should fail to login if password is longer than 4096', function (done) { var longPassword; for (var i = 0; i < 5000; i++) { From ea1697d0735ed0637aab96b2b8ccb4bf25de3593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Sep 2018 14:41:23 -0400 Subject: [PATCH 159/310] remove console.log --- test/authentication.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/authentication.js b/test/authentication.js index 650fcac74b..2c03d9549d 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -308,7 +308,6 @@ describe('authentication', function () { assert.ifError(err); loginUser('hasnopassword', 'doesntmatter', function (err, response, body) { assert.ifError(err); - console.log(response.statusCode, body); assert.equal(response.statusCode, 403); assert.equal(body, '[[error:invalid-login-credentials]]'); done(); From 93d52ef338d3b837babfb550b3d073f31212bc3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Sep 2018 16:23:40 -0400 Subject: [PATCH 160/310] default to 'recent' sort --- src/topics/recent.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/topics/recent.js b/src/topics/recent.js index 1556e081bc..834c0c5f52 100644 --- a/src/topics/recent.js +++ b/src/topics/recent.js @@ -26,6 +26,7 @@ module.exports = function (Topics) { }; params.term = params.term || 'alltime'; + params.sort = params.sort || 'recent'; if (params.hasOwnProperty('cids') && params.cids && !Array.isArray(params.cids)) { params.cids = [params.cids]; } From 37ca5a1c638faa3d120ab3f40b0c9e6a7b768563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Sep 2018 18:48:46 -0400 Subject: [PATCH 161/310] filter falsy teasers --- src/topics/teaser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/teaser.js b/src/topics/teaser.js index 3cc10185af..da7a05b59a 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -64,7 +64,7 @@ module.exports = function (Topics) { handleBlocks(uid, _postData, next); }, function (_postData, next) { - postData = _postData; + postData = _postData.filter(Boolean); var uids = _.uniq(postData.map(function (post) { return post.uid; })); From 60c54d6cdf0376508d172084c740e2a2cf990f93 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 8 Sep 2018 09:31:28 +0000 Subject: [PATCH 162/310] Latest translations and fallbacks --- public/language/lv/admin/general/sounds.json | 2 +- .../language/lv/admin/manage/categories.json | 4 ++-- public/language/lv/admin/manage/groups.json | 4 ++-- .../language/lv/admin/manage/privileges.json | 6 +++--- public/language/lv/admin/manage/tags.json | 14 +++++++------- public/language/lv/admin/manage/users.json | 14 +++++++------- public/language/lv/admin/menu.json | 8 ++++---- .../lv/admin/settings/notifications.json | 2 +- public/language/lv/admin/settings/post.json | 2 +- .../language/lv/admin/settings/reputation.json | 18 +++++++++--------- public/language/lv/admin/settings/user.json | 2 +- public/language/lv/error.json | 2 +- public/language/lv/pages.json | 12 ++++++------ public/language/lv/search.json | 4 ++-- public/language/lv/tags.json | 6 +++--- public/language/lv/user.json | 4 ++-- public/language/lv/users.json | 10 +++++----- .../zh-CN/admin/settings/advanced.json | 4 ++-- public/language/zh-CN/error.json | 2 +- public/language/zh-CN/global.json | 2 +- 20 files changed, 61 insertions(+), 61 deletions(-) diff --git a/public/language/lv/admin/general/sounds.json b/public/language/lv/admin/general/sounds.json index 0aca5337f8..e803819af5 100644 --- a/public/language/lv/admin/general/sounds.json +++ b/public/language/lv/admin/general/sounds.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Paziņojumi", "chat-messages": "Sarunas", "play-sound": "Play", "incoming-message": "Incoming Message", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index af0b4dac87..2950afb0d4 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -64,9 +64,9 @@ "alert.updated-success": "Category IDs %1 successfully updated.", "alert.upload-image": "Upload category image", "alert.find-user": "Find a User", - "alert.user-search": "Search for a user here...", + "alert.user-search": "Meklēt lietotājus šeit", "alert.find-group": "Find a Group", - "alert.group-search": "Search for a group here...", + "alert.group-search": "Meklēt grupas šeit...", "collapse-all": "Collapse All", "expand-all": "Expand All" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/groups.json b/public/language/lv/admin/manage/groups.json index 97a2b2d31b..a7c97d8119 100644 --- a/public/language/lv/admin/manage/groups.json +++ b/public/language/lv/admin/manage/groups.json @@ -4,7 +4,7 @@ "member-count": "Member Count", "system": "System Group", "edit": "Edit", - "search-placeholder": "Search", + "search-placeholder": "Meklēt", "create": "Create Group", "description-placeholder": "A short description about your group", "create-button": "Create", @@ -24,7 +24,7 @@ "edit.hidden": "Paslēpts", "edit.hidden-details": "Ja ir iespējota, šī grupa nebūs redzama grupu sarakstā un lietotāji būs jāuzaicina pašrocīgi", "edit.add-user": "Add User to Group", - "edit.add-user-search": "Search Users", + "edit.add-user-search": "Meklēt lietotājus", "edit.members": "Member List", "control-panel": "Groups Control Panel", "revert": "Revert", diff --git a/public/language/lv/admin/manage/privileges.json b/public/language/lv/admin/manage/privileges.json index 83a7452a5d..35d009e852 100644 --- a/public/language/lv/admin/manage/privileges.json +++ b/public/language/lv/admin/manage/privileges.json @@ -7,9 +7,9 @@ "upload-files": "Upload Files", "signature": "Signature", "ban": "Bloķēt", - "search-content": "Search Content", - "search-users": "Search Users", - "search-tags": "Search Tags", + "search-content": "Meklēt saturā", + "search-users": "Meklēt lietotājus", + "search-tags": "Meklēt birkās", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/lv/admin/manage/tags.json b/public/language/lv/admin/manage/tags.json index df597a6166..32f75053c5 100644 --- a/public/language/lv/admin/manage/tags.json +++ b/public/language/lv/admin/manage/tags.json @@ -2,18 +2,18 @@ "none": "Your forum does not have any topics with tags yet.", "bg-color": "Background Colour", "text-color": "Text Colour", - "create-modify": "Create & Modify Tags", + "create-modify": "Izveidot & rediģēt birkas", "description": "Select tags via clicking and/or dragging, use shift to select multiple.", "create": "Create Tag", - "modify": "Modify Tags", - "rename": "Rename Tags", - "delete": "Delete Selected Tags", - "search": "Search for tags...", + "modify": "Rediģēt birkas", + "rename": "Pārdēvēt birkas", + "delete": "Izdzēst atlasītās birkas", + "search": "Meklēt birkas...", "settings": "Click here to visit the tag settings page.", "name": "Tag Name", - "alerts.editing-multiple": "Editing multiple tags", + "alerts.editing-multiple": "Rediģē vairākas birkas", "alerts.editing-x": "Editing \"%1\" tag", - "alerts.confirm-delete": "Do you want to delete the selected tags?", + "alerts.confirm-delete": "Vai vēlies izdzēst šīs birkas?", "alerts.update-success": "Tag Updated!" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/users.json b/public/language/lv/admin/manage/users.json index 1f50ab3782..703e12c9fa 100644 --- a/public/language/lv/admin/manage/users.json +++ b/public/language/lv/admin/manage/users.json @@ -21,20 +21,20 @@ "pills.unvalidated": "Not Validated", "pills.no-posts": "No Posts", "pills.top-posters": "Top Posters", - "pills.top-rep": "Most Reputation", + "pills.top-rep": "Visvairāk ranga punktu", "pills.inactive": "Inactive", "pills.flagged": "Visvairāk atzīmēto", "pills.banned": "Bloķētie", - "pills.search": "User Search", + "pills.search": "Meklēt lietotājus", "search.uid": "By User ID", - "search.uid-placeholder": "Enter a user ID to search", + "search.uid-placeholder": "Ievadi meklējamo lietotāju", "search.username": "By User Name", - "search.username-placeholder": "Enter a username to search", + "search.username-placeholder": "Ievadi meklējamo lietotājvārdu", "search.email": "By Email", - "search.email-placeholder": "Enter a email to search", + "search.email-placeholder": "Ievadi meklējamo e-pasta adresi", "search.ip": "By IP Address", - "search.ip-placeholder": "Enter an IP Address to search", + "search.ip-placeholder": "Ievadi meklējamo IP adresi", "search.not-found": "User not found!", "inactive.3-months": "3 months", @@ -45,7 +45,7 @@ "users.username": "username", "users.email": "email", "users.postcount": "postcount", - "users.reputation": "reputation", + "users.reputation": "ranga punkti", "users.flags": "atzīmes", "users.joined": "joined", "users.last-online": "last online", diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index d425b099e7..8d78f84c1a 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -10,7 +10,7 @@ "section-manage": "Manage", "manage/categories": "Categories", "manage/privileges": "Privileges", - "manage/tags": "Tags", + "manage/tags": "Birkas", "manage/users": "Users", "manage/admins-mods": "Admins & Mods", "manage/registration": "Reģistrāciju rinda", @@ -21,7 +21,7 @@ "section-settings": "Settings", "settings/general": "General", - "settings/reputation": "Reputation", + "settings/reputation": "Ranga punkti", "settings/email": "Email", "settings/user": "User", "settings/group": "Group", @@ -30,8 +30,8 @@ "settings/post": "Post", "settings/chat": "Sarunāties", "settings/pagination": "Numerācija", - "settings/tags": "Tags", - "settings/notifications": "Notifications", + "settings/tags": "Birkas", + "settings/notifications": "Paziņojumi", "settings/cookies": "Sīkfaili", "settings/web-crawler": "Web Crawler", "settings/sockets": "Sockets", diff --git a/public/language/lv/admin/settings/notifications.json b/public/language/lv/admin/settings/notifications.json index 03fa0ac66a..31bc0a1585 100644 --- a/public/language/lv/admin/settings/notifications.json +++ b/public/language/lv/admin/settings/notifications.json @@ -1,5 +1,5 @@ { - "notifications": "Notifications", + "notifications": "Paziņojumi", "welcome-notification": "Welcome Notification", "welcome-notification-link": "Welcome Notification Link", "welcome-notification-uid": "Welcome Notification User (UID)", diff --git a/public/language/lv/admin/settings/post.json b/public/language/lv/admin/settings/post.json index fa11f5ae79..f8dac1565e 100644 --- a/public/language/lv/admin/settings/post.json +++ b/public/language/lv/admin/settings/post.json @@ -15,7 +15,7 @@ "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.rep-threshold": "Reputācijas slieksnis pirms ierobežojumu atcelšanas", "restrictions.seconds-defore-new": "Seconds before new user can post", "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)", diff --git a/public/language/lv/admin/settings/reputation.json b/public/language/lv/admin/settings/reputation.json index 910909ff65..bc939e14f0 100644 --- a/public/language/lv/admin/settings/reputation.json +++ b/public/language/lv/admin/settings/reputation.json @@ -1,14 +1,14 @@ { - "reputation": "Reputation Settings", - "disable": "Disable Reputation System", + "reputation": "Ranga punktu sistēma", + "disable": "Atspējot ranga punktu sistēmu", "disable-down-voting": "Disable Down Voting", "votes-are-public": "All Votes Are Public", "thresholds": "Activity Thresholds", - "min-rep-downvote": "Minimum reputation to downvote posts", - "min-rep-flag": "Minimum reputation to flag posts", - "min-rep-website": "Minimum reputation to add \"Website\" to user profile", - "min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile", - "min-rep-signature": "Minimum reputation to add \"Signature\" to user profile", - "min-rep-profile-picture": "Minimum reputation to add \"Profile Picture\" to user profile", - "min-rep-cover-picture": "Minimum reputation to add \"Cover Picture\" to user profile" + "min-rep-downvote": "Minimālie ranga punkti, lai balsotu pret ziņām", + "min-rep-flag": "Minimālie ranga punkti, lai atzīmēt ziņas", + "min-rep-website": "Minimālie ranga punkti, lai lietotāja profilma pievienotu \"Mājaslapu\"", + "min-rep-aboutme": "Minimālie ranga punkti, lai lietotāja profilma pievienotu \"Par mani\"", + "min-rep-signature": "Minimālie ranga punkti, lai lietotāja profilma pievienotu \"Parakstu\"", + "min-rep-profile-picture": "Minimālie ranga punkti, lai lietotāja profilma pievienotu \"Profila bildi\"", + "min-rep-cover-picture": "Minimālie ranga punkti, lai lietotāja profilma pievienotu \"Vāka bildi\"" } \ No newline at end of file diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json index c861e4fb50..270acf877f 100644 --- a/public/language/lv/admin/settings/user.json +++ b/public/language/lv/admin/settings/user.json @@ -46,7 +46,7 @@ "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": "Meklēt lietotājus", "user-search-results-per-page": "Number of results to display", "default-user-settings": "Default User Settings", "show-email": "Rādīt e-pasta adresi", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index 123e087b7f..4df14c5b69 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -121,7 +121,7 @@ "chat-deleted-already": "Saruna jau ir izdzēsta.", "chat-restored'already": "Saruna jau ir atjaunota.", "already-voting-for-this-post": "Tu jau balsoji par šo ziņu.", - "reputation-system-disabled": "Reputācijas sistēma ir atspējota.", + "reputation-system-disabled": "Ranga punktu sistēma ir atspējota.", "downvoting-disabled": "Balsošana pret ir atspējota", "not-enough-reputation-to-downvote": "Tev nepietiek ranga punktu, lai balsotu pret šo ziņu", "not-enough-reputation-to-flag": "Tev nepietiek ranga punktu, lai paziņot par šo ziņu", diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 412fd692b7..49632b6008 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -14,15 +14,15 @@ "flagged-content": "Atzīmētais saturs", "ip-blacklist": "IP adrešu melnais saraksts", "post-queue": "Ziņu rinda", - "users/online": "Online Users", - "users/latest": "Latest Users", + "users/online": "Lietotāji tiešsaistē", + "users/latest": "Jaunākie lietotāji", "users/sort-posts": "Lietotāji ar visvairāk ziņu", - "users/sort-reputation": "Users with the most reputation", + "users/sort-reputation": "Lietotāji ar visvairāk ranga punktu", "users/banned": "Bloķētie lietotāji", "users/most-flags": "Visvairāk atzīmēto lietotāju", - "users/search": "User Search", - "notifications": "Notifications", - "tags": "Tags", + "users/search": "Meklēt lietotājus", + "notifications": "Paziņojumi", + "tags": "Birkas", "tag": "Topics tagged under "%1"", "register": "Register an account", "registration-complete": "Reģistrācija ir pabeigta", diff --git a/public/language/lv/search.json b/public/language/lv/search.json index cbb2fb4bfc..b92935bb50 100644 --- a/public/language/lv/search.json +++ b/public/language/lv/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", - "advanced-search": "Advanced Search", + "advanced-search": "Meklēt izvērsti", "in": "In", "titles": "Titles", "titles-posts": "Titles and Posts", @@ -11,7 +11,7 @@ "posted-by": "Posted by", "in-categories": "In Categories", "search-child-categories": "Search child categories", - "has-tags": "Has tags", + "has-tags": "Ir birkas", "reply-count": "Reply Count", "at-least": "At least", "at-most": "At most", diff --git a/public/language/lv/tags.json b/public/language/lv/tags.json index c416d8d4ec..bb18904f96 100644 --- a/public/language/lv/tags.json +++ b/public/language/lv/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "There are no topics with this tag.", - "tags": "Tags", + "tags": "Birkas", "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", - "enter_tags_here_short": "Enter tags...", - "no_tags": "There are no tags yet." + "enter_tags_here_short": "Ievadi birkas...", + "no_tags": "Birku vēl nav" } \ No newline at end of file diff --git a/public/language/lv/user.json b/public/language/lv/user.json index a1cea145ba..5a2fcfbcdd 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -23,7 +23,7 @@ "lastonline": "Last Online", "profile": "Profile", "profile_views": "Profile views", - "reputation": "Reputation", + "reputation": "Ranga punkti", "bookmarks": "Bookmarks", "watched": "Watched", "ignored": "Ignored", @@ -102,7 +102,7 @@ "max_items_per_page": "Maximum %1", "acp_language": "Admin Page Language", "notification_sounds": "Play a sound when you receive a notification", - "notifications_and_sounds": "Notifications & Sounds", + "notifications_and_sounds": "Paziņojumi & skaņas", "incoming-message-sound": "Incoming message sound", "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index b5150b0ea2..8d4b491d75 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -1,12 +1,12 @@ { "latest_users": "Latest Users", "top_posters": "Top Posters", - "most_reputation": "Most Reputation", + "most_reputation": "Visvairāk ranga punktu", "most_flags": "Visvairāk atzīmju", - "search": "Search", - "enter_username": "Enter a username to search", + "search": "Meklēt", + "enter_username": "Ievadi meklējamo lietotājvārdu", "load_more": "Load More", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", + "users-found-search-took": "Atrasti %1 lietotājs(-i)! Meklēšana ilga %2 sekundes.", "filter-by": "Filter By", "online-only": "Online only", "invite": "Uzaicināt", @@ -16,6 +16,6 @@ "popular_topics": "Populārās tēmas", "unread_topics": "Nelasītie temati", "categories": "Categories", - "tags": "Tags", + "tags": "Birkas", "no-users-found": "No users found!" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/advanced.json b/public/language/zh-CN/admin/settings/advanced.json index 966acd6148..4836396efb 100644 --- a/public/language/zh-CN/admin/settings/advanced.json +++ b/public/language/zh-CN/admin/settings/advanced.json @@ -13,10 +13,10 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "严格安全传输(HSTS)", - "hsts.enabled": "Enabled HSTS (recommended)", + "hsts.enabled": "启用HSTS(推荐)", "hsts.subdomains": "HSTS头信息包含的域名", "hsts.preload": "允许在HSTS头信息中预加载(preloading)", - "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts.help": "如果启用此项,站点将会向浏览器发送HSTS头信息。您可以设置是否为子域名开启HSTS,以及HSTS头信息中是否包含预加载标志(preload参数)如果您不了解HSTS,可以忽略此项设置。了解详情 ", "traffic-management": "流量管理", "traffic.help": "NodeBB 拥有在高流量情况下自动拒绝请求的模块。尽管默认值就很棒,但您可以在这里调整这些设置。", "traffic.enable": "启用流量管理", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index c0c59e797f..5c103a5fce 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -78,7 +78,7 @@ "still-uploading": "请等待上传完成", "file-too-big": "上传文件的大小限制为 %1 KB - 请缩减文件大小", "guest-upload-disabled": "未登录用户不允许上传", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "由于CORS配置错误,无法上传图片。", "already-bookmarked": "您已将此贴存为了书签", "already-unbookmarked": "您已取消了此贴的书签", "cant-ban-other-admins": "您不能封禁其他管理员!", diff --git a/public/language/zh-CN/global.json b/public/language/zh-CN/global.json index 7d5cfefc30..a3d4608ace 100644 --- a/public/language/zh-CN/global.json +++ b/public/language/zh-CN/global.json @@ -85,7 +85,7 @@ "language": "语言", "guest": "游客", "guests": "游客", - "former_user": "A Former User", + "former_user": "老用户", "updated.title": "论坛已更新", "updated.message": "论坛已更新。请点这里刷新页面。", "privacy": "隐私", From ebaea9b6c11be8099b8664eb89337747dbc37672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 8 Sep 2018 14:01:15 -0400 Subject: [PATCH 163/310] closes #6743 --- public/src/admin/extend/plugins.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index 1d43db6043..2886c3c1c7 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -20,7 +20,7 @@ define('admin/extend/plugins', ['jqueryui', 'translator', 'benchpress'], functio pluginsList.on('click', 'button[data-action="toggleActive"]', function () { var pluginEl = $(this).parents('li'); pluginID = pluginEl.attr('data-plugin-id'); - var btn = $('#' + pluginID + ' [data-action="toggleActive"]'); + var btn = $('[id="' + pluginID + '"] [data-action="toggleActive"]'); var pluginData = ajaxify.data.installed[pluginEl.attr('data-plugin-index')]; @@ -34,7 +34,7 @@ define('admin/extend/plugins', ['jqueryui', 'translator', 'benchpress'], functio btn.toggleClass('btn-warning', status.active).toggleClass('btn-success', !status.active); // clone it to active plugins tab - if (status.active && !$('#active #' + pluginID).length) { + if (status.active && !$('#active [id="' + pluginID + '"]').length) { $('#active ul').prepend(pluginEl.clone(true)); } From 41aae6f418a22c50e4de65509a35c9468e86e3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 11 Sep 2018 11:11:41 -0400 Subject: [PATCH 164/310] closes #6749 --- src/controllers/groups.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 30dd604c56..6063653fc0 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -7,6 +7,7 @@ var meta = require('../meta'); var groups = require('../groups'); var user = require('../user'); var helpers = require('./helpers'); +var pagination = require('../pagination'); var groupsController = module.exports; @@ -113,7 +114,12 @@ groupsController.details = function (req, res, callback) { }; groupsController.members = function (req, res, callback) { + var page = parseInt(req.query.page, 10) || 1; + var usersPerPage = 50; + var start = Math.max(0, (page - 1) * usersPerPage); + var stop = start + usersPerPage - 1; var groupName; + var groupData; async.waterfall([ function (next) { groups.getGroupNameByGroupSlug(req.params.slug, next); @@ -127,14 +133,16 @@ groupsController.members = function (req, res, callback) { isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid), isMember: async.apply(groups.isMember, req.uid, groupName), isHidden: async.apply(groups.isHidden, groupName), + groupData: async.apply(groups.getGroupData, groupName), }, next); }, function (results, next) { if (results.isHidden && !results.isMember && !results.isAdminOrGlobalMod) { return callback(); } + groupData = results.groupData; - user.getUsersFromSet('group:' + groupName + ':members', req.uid, 0, 49, next); + user.getUsersFromSet('group:' + groupName + ':members', req.uid, start, stop, next); }, function (users) { var breadcrumbs = helpers.buildBreadcrumbs([ @@ -143,10 +151,10 @@ groupsController.members = function (req, res, callback) { { text: '[[groups:details.members]]' }, ]); + var pageCount = Math.max(1, Math.ceil(groupData.memberCount / usersPerPage)); res.render('groups/members', { users: users, - nextStart: 50, - loadmore_display: users.length > 50 ? 'block' : 'hide', + pagination: pagination.create(page, pageCount, req.query), breadcrumbs: breadcrumbs, }); }, From cfe0e690b5514b786b0ea56d3f65ff22718c06eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 11 Sep 2018 11:14:27 -0400 Subject: [PATCH 165/310] up themes --- install/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/package.json b/install/package.json index a8dcb2aa25..8b16e0197a 100644 --- a/install/package.json +++ b/install/package.json @@ -77,9 +77,9 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.30", - "nodebb-theme-slick": "1.2.9", - "nodebb-theme-vanilla": "10.1.3", + "nodebb-theme-persona": "9.0.31", + "nodebb-theme-slick": "1.2.10", + "nodebb-theme-vanilla": "10.1.4", "nodebb-widget-essentials": "4.0.7", "nodemailer": "^4.6.5", "passport": "^0.4.0", From fe118fe1c3620a68e4c6fdc44ed1b3c84479b1d6 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 13 Sep 2018 09:31:43 +0000 Subject: [PATCH 166/310] Latest translations and fallbacks --- public/language/nl/email.json | 4 +- public/language/nl/error.json | 2 +- public/language/nl/global.json | 2 +- public/language/nl/groups.json | 2 +- public/language/nl/modules.json | 4 +- public/language/nl/pages.json | 8 +- public/language/nl/user.json | 8 +- .../language/ru/admin/advanced/database.json | 2 +- .../language/ru/admin/development/logger.json | 4 +- .../language/ru/admin/general/homepage.json | 12 +- .../language/ru/admin/general/languages.json | 8 +- public/language/ru/admin/general/social.json | 6 +- .../language/ru/admin/manage/categories.json | 84 ++++----- public/language/ru/admin/manage/groups.json | 10 +- .../ru/admin/manage/registration.json | 8 +- public/language/ru/admin/manage/users.json | 160 +++++++++--------- .../language/ru/admin/settings/advanced.json | 6 +- public/language/ru/admin/settings/chat.json | 10 +- public/language/ru/admin/settings/post.json | 12 +- .../language/ru/admin/settings/sockets.json | 8 +- public/language/ru/admin/settings/user.json | 108 ++++++------ public/language/ru/error.json | 2 +- public/language/ru/global.json | 2 +- public/language/ru/modules.json | 4 +- public/language/ru/user.json | 2 +- 25 files changed, 239 insertions(+), 239 deletions(-) diff --git a/public/language/nl/email.json b/public/language/nl/email.json index 0b0906255f..65d75c893c 100644 --- a/public/language/nl/email.json +++ b/public/language/nl/email.json @@ -4,8 +4,8 @@ "invite": "Uitnodiging van %1 ", "greeting_no_name": "Hallo", "greeting_with_name": "Hallo %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Verifieer alstublieft uw e-mail", + "email.verify.text1": "Je e-mailadres is gewijzigd!", "welcome.text1": "Bedank voor het registreren bij %1!", "welcome.text2": "Om je account volledig te activeren, moet je de instructies uit het bevestigingsbericht opvolgen. Controleer daarom nu eerst je e-mail inbox voor de activeringscode en volg de link in het bericht.", "welcome.text3": "Een administrator heeft uw registratie geaccepteerd. U kan nu inloggen met uw gebruikersnaam en wachtwoord.", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 088ebb7f2f..bae72adb09 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -78,7 +78,7 @@ "still-uploading": "Een moment geduld tot alle bestanden overgebracht zijn...", "file-too-big": "Maximum toegestane bestandsgrootte is %1 kB - probeer een kleiner bestand te verzenden", "guest-upload-disabled": "Uploads voor gasten zijn uitgeschaleld ", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Kan plaatje niet uploaden door verkeerd geconfigureerd CORS", "already-bookmarked": "Je hebt dit bericht al als favoriet toegevoegd", "already-unbookmarked": "Je hebt dit bericht al verwijderd uit je favorieten", "cant-ban-other-admins": "Het is niet toegestaan andere beheerders te verbannen!", diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 2807f561d9..ed4d0bcd50 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -85,7 +85,7 @@ "language": "Taal", "guest": "Gast", "guests": "Gasten", - "former_user": "A Former User", + "former_user": "Een ex-gebruiker", "updated.title": "Site update", "updated.message": "Deze site heeft zojuist een update ontvangen. Klik hier om de pagina te verversen.", "privacy": "Privé", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 217abf020d..ec227f8b4a 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -28,7 +28,7 @@ "details.grant": "Toekennen/herroepen van eigendom", "details.kick": "Kick", "details.kick_confirm": "Weet u zeker dat u de gebruiker wilt verwijderen uit de groep?", - "details.add-member": "Add Member", + "details.add-member": "Voeg lid toe", "details.owner_options": "Groepsadministratie", "details.group_name": "Groepsnaam", "details.member_count": "Ledentelling", diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index d97713b793..8c10ce814a 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Weet je zeker dat je dit bericht wilt verwijderen?", "chat.retrieving-users": "Gebruikers ophalen...", "chat.manage-room": "Chat Room beheren", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Zoek hier naar gebruikers. Indien geselecteerd word de gebruiker toegevoegd aan de chat. De nieuwe gebruiker kan geen chatberichten zien die geschreven zijn voordat de gebruiker was toegevoegd aan de conversatie. Alleen chatroom-eigenaren () kunnen gebruikers verwijderen uit een chatroom.", "chat.confirm-chat-with-dnd-user": "Deze gebruiker heeft de status op Niet Storen (DnD, Do not disturb) gezet. Wil je nog steeds een chat starten met deze persoon?", "chat.rename-room": "Hernoem chatroom", "chat.rename-placeholder": "Voer hier de naam van je chat room in", @@ -33,7 +33,7 @@ "chat.in-room": "In deze chat room", "chat.kick": "Schop", "chat.show-ip": "Geef IP weer", - "chat.owner": "Room Owner", + "chat.owner": "Chatroom-eigenaar", "composer.compose": "Samenstellen", "composer.show_preview": "Voorbeeldweergave", "composer.hide_preview": "Verberg voorbeeld", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 496aa6f2ca..2a4d144d84 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -6,10 +6,10 @@ "popular-month": "De populaire onderwerpen van deze maand", "popular-alltime": "De populaire onderwerpen", "recent": "Recente onderwerpen", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Meest gestemde onderwerpen vandaag", + "top-week": "Meest gestemde onderwerpen van deze week", + "top-month": "Meest gestemde onderwerpen van deze maand", + "top-alltime": "Meest gestemde onderwerpen", "moderator-tools": "Moderator gereedschappen", "flagged-content": "Gemarkeerde content", "ip-blacklist": "IP zwarte lijst", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index dbc7a30c53..986bae4345 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -31,8 +31,8 @@ "following": "Volgend", "blocks": "Blokkeringen", "block_toggle": "Toggle Blokkering", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Blokkeer gebruiker", + "unblock_user": "Deblokkeer gebruiker", "aboutme": "Over mij", "signature": "Handtekening", "birthday": "Verjaardag", @@ -109,9 +109,9 @@ "no-sound": "Geen geluid", "upvote-notif-freq": "Notificatie frequentie voor Upvotes", "upvote-notif-freq.all": "Alle Upvotes", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "Eerst per bericht", "upvote-notif-freq.everyTen": "Elke tien Upvotes", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "Bij 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "Bij 10, 100, 1000...", "upvote-notif-freq.disabled": "Uitgeschakeld", "browsing": "Instellingen voor bladeren", diff --git a/public/language/ru/admin/advanced/database.json b/public/language/ru/admin/advanced/database.json index 63177d4dd5..23b262e544 100644 --- a/public/language/ru/admin/advanced/database.json +++ b/public/language/ru/admin/advanced/database.json @@ -35,6 +35,6 @@ "redis.raw-info": "Redis необработанная информация", "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", + "postgres.version": "Версия PostgreSQL", "postgres.raw-info": "Postgres Raw Info" } diff --git a/public/language/ru/admin/development/logger.json b/public/language/ru/admin/development/logger.json index 3de1a58cb0..5fceb15935 100644 --- a/public/language/ru/admin/development/logger.json +++ b/public/language/ru/admin/development/logger.json @@ -1,11 +1,11 @@ { "logger-settings": "Настройки логгера", "description": "Включив чек-боксы, вы получите логи на свой терминал. Если вы укажете путь, логи будут сохранены в файле. Протокол HTTP полезен для сбора статистики о том, кто, когда и где посетители получают на вашем форуме. Помимо регистрации HTTP-запросов, мы также можем регистрировать события socket.io. Регистрация Socket.io в сочетании с монитором redis-cli может быть очень полезна для исследования внутреннего состояния NodeBB.", - "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", + "explanation": "Просто установить/снять настройки логирования чтобы включить или отключить логирование на лету. Перезапуск не нужен.", "enable-http": "Включить HTTP логирование", "enable-socket": "Включить логирование событий socket.io", "file-path": "Путь до файла логов", - "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", + "file-path-placeholder": "/path/to/log/file.log ::: оставить пустым чтобы смотреть логи в командной строке", "control-panel": "Контрольная панель логгера", "update-settings": "Применить настройки логгера" diff --git a/public/language/ru/admin/general/homepage.json b/public/language/ru/admin/general/homepage.json index 7428d59eeb..494c564c6a 100644 --- a/public/language/ru/admin/general/homepage.json +++ b/public/language/ru/admin/general/homepage.json @@ -1,8 +1,8 @@ { - "home-page": "Home Page", - "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", - "home-page-title": "Title of the home page (default \"Home\")" + "home-page": "Домашняя страница", + "description": "Выюбрать какую страницу показывать когда пользователи доходят до верхнего URL форума.", + "home-page-route": "Переход на домашнюю страницу", + "custom-route": "Настраиваемый переход", + "allow-user-home-pages": "Разрешить пользовательские домашние страницы", + "home-page-title": "Название домашней страницы (по умолчанию \"Домашняя\")" } \ No newline at end of file diff --git a/public/language/ru/admin/general/languages.json b/public/language/ru/admin/general/languages.json index bdd57849b3..641d366241 100644 --- a/public/language/ru/admin/general/languages.json +++ b/public/language/ru/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/ru/admin/general/social.json b/public/language/ru/admin/general/social.json index 23aedfcfaa..706bd3cf95 100644 --- a/public/language/ru/admin/general/social.json +++ b/public/language/ru/admin/general/social.json @@ -1,5 +1,5 @@ { - "post-sharing": "Post Sharing", - "info-plugins-additional": "Plugins can add additional networks for sharing posts.", - "save-success": "Successfully saved Post Sharing Networks!" + "post-sharing": "Поделиться постом", + "info-plugins-additional": "Плагины могут добавить дополнительные сети чтобы делиться постами", + "save-success": "Успешно сохранены сети чтобы делиться постами!" } \ No newline at end of file diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index 6e5a4337cf..7542cbc06b 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -8,18 +8,18 @@ "text-color": "Цвет текста", "bg-image-size": "Размер фонового изображения", "custom-class": "Свой класс", - "num-recent-replies": "# of Recent Replies", + "num-recent-replies": "# последних ответов", "ext-link": "Внешняя ссылка", - "is-section": "Treat this category as a section", + "is-section": "Рассматривать эту категорию как секцию", "upload-image": "Загрузить изображение", "delete-image": "Удалить", "category-image": "Изображение категории", "parent-category": "Родительская категория", "optional-parent-category": "(не обязательно) Родительская категория\n", - "parent-category-none": "(None)", + "parent-category-none": "(Пусто)", "copy-settings": "Копировать настройки из", "optional-clone-settings": "(не обязательно) Копировать настройки из", - "clone-children": "Clone Children Categories And Settings", + "clone-children": "Дублировать вложенные категориии настройки", "purge": "Очистить категорию", "enable": "Включить", @@ -29,44 +29,44 @@ "select-category": "Указать категорию", "set-parent-category": "Указать родительскую категорию", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. You can add a new user to this table by searching for them in the form below.", - "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", - "privileges.section-viewing": "Viewing Privileges", - "privileges.section-posting": "Posting Privileges", - "privileges.section-moderation": "Moderation Privileges", - "privileges.section-user": "User", - "privileges.search-user": "Add User", - "privileges.no-users": "No user-specific privileges in this category.", - "privileges.section-group": "Group", - "privileges.group-private": "This group is private", - "privileges.search-group": "Add Group", - "privileges.copy-to-children": "Copy to Children", - "privileges.copy-from-category": "Copy from Category", - "privileges.inherit": "If the registered-users group is granted a specific privilege, all other groups receive an implicit privilege, even if they are not explicitly defined/checked. This implicit privilege is shown to you because all users are part of the registered-users user group, and so, privileges for additional groups need not be explicitly granted.", + "privileges.description": "В этой секции вы можете настроить права на управление доступом. Права могут быть предоставлены как на пользователя, так и на группу. Вы можете добавлять новых пользователей в эту таблицу с помощью формы поиска ниже.", + "privileges.warning": "Замечание: Настройки прав применяются немедленно. Нет необходимости сохранять категорию после изменения настроек.", + "privileges.section-viewing": "Права на просмотр", + "privileges.section-posting": "Права на создание поста", + "privileges.section-moderation": "Права модераторов", + "privileges.section-user": "Пользователь", + "privileges.search-user": "Добавить пользователя", + "privileges.no-users": "В этой категории нет специально заданных прав пользователя.", + "privileges.section-group": "Группа", + "privileges.group-private": "Это частная группа", + "privileges.search-group": "Добавить группу", + "privileges.copy-to-children": "Скопировать в дочерний", + "privileges.copy-from-category": "Скопировать из категории", + "privileges.inherit": "Если группа зарегистрированных пользователей получает дополнительные права, то все другие группы (¿какие другие группы? подгруппы?¿) получают эти права неявным образом, даже если они специально не заданы. Эти неявным образом заданные права показаны вам потому что все пользователи (¿и даже незарегистрированные?¿) являются частью группы зарегистрированных пользователей, так что права для дополнительных групп не обязаны задаваться явным образом.", - "analytics.back": "Back to Categories List", - "analytics.title": "Analytics for \"%1\" category", - "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", - "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", - "analytics.topics-daily": "Figure 3 – Daily topics created in this category", - "analytics.posts-daily": "Figure 4 – Daily posts made in this category", + "analytics.back": "Назад к списку категорий", + "analytics.title": "Аналитика \"%1\" категории", + "analytics.pageviews-hourly": "График 1 – просмотры этой категории за час", + "analytics.pageviews-daily": "График 2 – просмотры этой категории за день", + "analytics.topics-daily": "График 3 – Созданные топики в этой категории за день", + "analytics.posts-daily": "График 4 – Посты, сделанные в этой категории за день", - "alert.created": "Created", - "alert.create-success": "Category successfully created!", - "alert.none-active": "You have no active categories.", - "alert.create": "Create a Category", - "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", - "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", - "alert.purge-success": "Category purged!", - "alert.copy-success": "Settings Copied!", - "alert.set-parent-category": "Set Parent Category", - "alert.updated": "Updated Categories", - "alert.updated-success": "Category IDs %1 successfully updated.", - "alert.upload-image": "Upload category image", - "alert.find-user": "Find a User", - "alert.user-search": "Search for a user here...", - "alert.find-group": "Find a Group", - "alert.group-search": "Search for a group here...", - "collapse-all": "Collapse All", - "expand-all": "Expand All" + "alert.created": "Создано", + "alert.create-success": "Категория успешно создана!", + "alert.none-active": "У вас нет активных категорий.", + "alert.create": "Создать категорию", + "alert.confirm-moderate": " Вы уверены, что предоставляете права модератора этой группе пользователей? Это открытая группа, так что любой пользователь может к ней присоединиться по желанию.", + "alert.confirm-purge": "

Вы точно хотите очистить эту категорию \"%1\"?

Предупреждение! Все топики и посты этой категории будут удалены

Очистка категории удаляет все топики и посты, а также удаляет категорию из базы данных. Если вы хотите удалить категорию временно, вместо очистки вам нужно выбрать \"отключить\" .

", + "alert.purge-success": "Категория очищена!", + "alert.copy-success": "Настройки скопированы!", + "alert.set-parent-category": "Установить родительскую категорию", + "alert.updated": "Обновленные категории", + "alert.updated-success": "Категория IDs %1 успешно обновлена.", + "alert.upload-image": "Загрузить изображение категории", + "alert.find-user": "Найти пользователя", + "alert.user-search": "Искать пользователя...", + "alert.find-group": "Найти Группу", + "alert.group-search": "Искать группу...", + "collapse-all": "Свернуть всё", + "expand-all": "Развернуть всё" } \ No newline at end of file diff --git a/public/language/ru/admin/manage/groups.json b/public/language/ru/admin/manage/groups.json index c019ec9823..9032b0d49a 100644 --- a/public/language/ru/admin/manage/groups.json +++ b/public/language/ru/admin/manage/groups.json @@ -1,13 +1,13 @@ { - "name": "Group Name", + "name": "Название группы", "description": "Group Description", "member-count": "Member Count", "system": "System Group", - "edit": "Edit", - "search-placeholder": "Search", - "create": "Create Group", + "edit": "Редактировать", + "search-placeholder": "Поиск", + "create": "Создать группу", "description-placeholder": "A short description about your group", - "create-button": "Create", + "create-button": "Создать", "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", "alerts.confirm-delete": "Are you sure you wish to delete this group?", diff --git a/public/language/ru/admin/manage/registration.json b/public/language/ru/admin/manage/registration.json index d066d7090c..55ee19940d 100644 --- a/public/language/ru/admin/manage/registration.json +++ b/public/language/ru/admin/manage/registration.json @@ -1,14 +1,14 @@ { - "queue": "Queue", + "queue": "Очередь", "description": "В очереди регистраций нет пользователей.
Чтобы включить эту возможность перейдите в Настройки &arr; Пользователь &arr; Регистрация пользователя и задайте Тип регистрации как \"Подтверждение администратором\"", "list.name": "Имя", "list.email": "Email", "list.ip": "IP", "list.time": "Время", - "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", - "list.email-spam": "Frequency: %1 Appears: %2", - "list.ip-spam": "Frequency: %1 Appears: %2", + "list.username-spam": "Частота: %1 Появлений: %2 Доверие: %3", + "list.email-spam": "Частота: %1 Появлений: %2", + "list.ip-spam": "Частота: %1 Появлений: %2", "invitations": "Приглашения", "invitations.description": "Ниже приведен полный список отправленных приглашений. Для поиска по списку по электронной почте или имени пользователя используйте сочетание клавиш CTRL+F . < br > < br > Имена пользователей, которые приняли приглашение, будут отображаться справа от электронной почты.", diff --git a/public/language/ru/admin/manage/users.json b/public/language/ru/admin/manage/users.json index 31ab48bbbb..8cfa152f9e 100644 --- a/public/language/ru/admin/manage/users.json +++ b/public/language/ru/admin/manage/users.json @@ -4,96 +4,96 @@ "make-admin": "Сделать администратором", "remove-admin": "Удалить администратора", "validate-email": "Подтвердить адрес электронной почты", - "send-validation-email": "Send Validation Email", - "password-reset-email": "Send Password Reset Email", - "ban": "Ban User(s)", - "temp-ban": "Ban User(s) Temporarily", - "unban": "Unban User(s)", - "reset-lockout": "Reset Lockout", - "reset-flags": "Reset Flags", - "delete": "Delete User(s)", - "purge": "Delete User(s) and Content", - "download-csv": "Download CSV", - "invite": "Invite", - "new": "New User", + "send-validation-email": "Подтвердить адрес электронной почты", + "password-reset-email": "Выслать письмо для сброса пароля", + "ban": "Забанить пользователя (-ей)", + "temp-ban": "Временно забанить пользователя (-ей)", + "unban": "Снять бан с пользователя (-ей)", + "reset-lockout": "Снять блокировку", + "reset-flags": "Сбросить флаги", + "delete": "Удалить пользователя (-ей)", + "purge": "Удалить пользователя (-ей) и данные", + "download-csv": "Скачать CSV", + "invite": "Пригласить", + "new": "Новый пользователь", - "pills.latest": "Latest Users", - "pills.unvalidated": "Not Validated", - "pills.no-posts": "No Posts", - "pills.top-posters": "Top Posters", - "pills.top-rep": "Most Reputation", - "pills.inactive": "Inactive", - "pills.flagged": "Most Flagged", - "pills.banned": "Banned", - "pills.search": "User Search", + "pills.latest": "Последние пользователи", + "pills.unvalidated": "Не проверено", + "pills.no-posts": "Нет постов", + "pills.top-posters": "Самые активные", + "pills.top-rep": "С самой большой репутацией", + "pills.inactive": "Неактивно", + "pills.flagged": "Самый отмеченный", + "pills.banned": "Заблокированные участники", + "pills.search": "Поиск пользователей", - "search.uid": "By User ID", - "search.uid-placeholder": "Enter a user ID to search", - "search.username": "By User Name", - "search.username-placeholder": "Enter a username to search", - "search.email": "By Email", - "search.email-placeholder": "Enter a email to search", - "search.ip": "By IP Address", - "search.ip-placeholder": "Enter an IP Address to search", - "search.not-found": "User not found!", + "search.uid": "По ID пользователя", + "search.uid-placeholder": "Введите ID пользователя для поиска", + "search.username": "По имени пользователя", + "search.username-placeholder": "Введите имя пользователя для поиска", + "search.email": "по Email", + "search.email-placeholder": "Введите Email для поиска", + "search.ip": "По IP адресу", + "search.ip-placeholder": "Введите IP адрес для поиска", + "search.not-found": "Пользователь не найден!", - "inactive.3-months": "3 months", - "inactive.6-months": "6 months", - "inactive.12-months": "12 months", + "inactive.3-months": "3 месяца", + "inactive.6-months": "6 месяцев", + "inactive.12-months": "12 месяцев", - "users.uid": "uid", - "users.username": "username", + "users.uid": "ID пользователя", + "users.username": "Имя пользователя", "users.email": "email", - "users.postcount": "postcount", - "users.reputation": "reputation", - "users.flags": "flags", - "users.joined": "joined", - "users.last-online": "last online", - "users.banned": "banned", + "users.postcount": "Счетчик постов", + "users.reputation": "Репутация", + "users.flags": "Отметки", + "users.joined": "Присоединился", + "users.last-online": "Последний раз был в сети", + "users.banned": "забанен", - "create.username": "User Name", + "create.username": "Имя пользователя", "create.email": "Email", - "create.email-placeholder": "Email of this user", - "create.password": "Password", - "create.password-confirm": "Confirm Password", + "create.email-placeholder": "Email этого пользователя", + "create.password": "Пароль", + "create.password-confirm": "Подтвердите пароль", - "temp-ban.length": "Ban Length", - "temp-ban.reason": "Reason (Optional)", - "temp-ban.hours": "Hours", - "temp-ban.days": "Days", - "temp-ban.explanation": "Enter the length of time for the ban. Note that a time of 0 will be a considered a permanent ban.", + "temp-ban.length": "Период бана", + "temp-ban.reason": "Причина (Необязательно)", + "temp-ban.hours": "Часов", + "temp-ban.days": "Дней", + "temp-ban.explanation": "Введите продолжительность бана. Имейте ввиду, что время \"0\" будет означать вечный бан.", - "alerts.confirm-ban": "Do you really want to ban this user permanently?", - "alerts.confirm-ban-multi": "Do you really want to ban these users permanently?", - "alerts.ban-success": "User(s) banned!", - "alerts.button-ban-x": "Ban %1 user(s)", - "alerts.unban-success": "User(s) unbanned!", - "alerts.lockout-reset-success": "Lockout(s) reset!", - "alerts.flag-reset-success": "Flags(s) reset!", - "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", - "alerts.make-admin-success": "User is now administrator.", - "alerts.confirm-remove-admin": "Do you really want to remove this administrator?", - "alerts.remove-admin-success": "User is no longer administrator.", - "alerts.make-global-mod-success": "User is now global moderator.", - "alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?", - "alerts.remove-global-mod-success": "User is no longer global moderator.", - "alerts.make-moderator-success": "User is now moderator.", - "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", - "alerts.remove-moderator-success": "User is no longer moderator.", - "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", - "alerts.validate-email-success": "Emails validated", - "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", - "alerts.confirm-delete": "Warning!
Do you really want to delete user(s)?
This action is not reversable! Only the user account will be deleted, their posts and topics will remain.", - "alerts.delete-success": "User(s) Deleted!", - "alerts.confirm-purge": "Warning!
Do you really want to delete user(s) and their content?
This action is not reversable! All user data and content will be erased!", - "alerts.create": "Create User", + "alerts.confirm-ban": "Вы действительно хотите забанить этого участника навсегда?", + "alerts.confirm-ban-multi": "Вы действительно хотите забанить этих участников навсегда?", + "alerts.ban-success": "Пользователь(и) забанен(ы)!", + "alerts.button-ban-x": "Забанить %1 пользователя(-ей)", + "alerts.unban-success": "Пользователь(и) разбанен(ы)!", + "alerts.lockout-reset-success": "Блокировка(и) сброшена(ы)!", + "alerts.flag-reset-success": "Отметка(и) сброшена(ы)!", + "alerts.no-remove-yourself-admin": "Вы не можете удалить себя как Администратора!", + "alerts.make-admin-success": "Пользователь теперь Администратор.", + "alerts.confirm-remove-admin": "Вы действительно хотите удалить этого администратора?", + "alerts.remove-admin-success": "Пользователь больше не администратор.", + "alerts.make-global-mod-success": "Пользователь теперь Общий модератор .", + "alerts.confirm-remove-global-mod": "Вы действительно хотите удалить этого общего модератора?", + "alerts.remove-global-mod-success": "Пользователь больше не общий модератор.", + "alerts.make-moderator-success": "Пользователь теперь модератор .", + "alerts.confirm-remove-moderator": "Вы действительно хотите удалить этого модератора?", + "alerts.remove-moderator-success": "Пользователь больше не модератор.", + "alerts.confirm-validate-email": "Вы хотите утвердить email(s) этого пользователя(-ей)?", + "alerts.validate-email-success": "Email утверждены.", + "alerts.password-reset-confirm": "Вы хотите послать письмо(а) со сбросом пароля этому пользователю(ям)?", + "alerts.confirm-delete": "Внимание!
Вы действительно хотите удалить этого пользователя(ей)?
Это действие необратимо! Удалится только аккаунт пользователя, его посты и топики останутся.", + "alerts.delete-success": "Пользователь(и) Удален(ы)!", + "alerts.confirm-purge": "Внимание!
Вы действительно хотите удалить этого пользователя(ей) и их данные?
Это действие необратимо! Удалится вообще всё!", + "alerts.create": "Создать пользователя", "alerts.button-create": "Создать", - "alerts.button-cancel": "Cancel", - "alerts.error-passwords-different": "Passwords must match!", - "alerts.error-x": "Error

%1

", - "alerts.create-success": "User created!", + "alerts.button-cancel": "Отмена", + "alerts.error-passwords-different": "Пароли должны совпадать!", + "alerts.error-x": "Ошибка

%1

", + "alerts.create-success": "Пользователь создан!", "alerts.prompt-email": "Email: ", - "alerts.email-sent-to": "An invitation email has been sent to %1", - "alerts.x-users-found": "%1 user(s) found! Search took %2 ms." + "alerts.email-sent-to": "Приглашение для участника %1 было отправлено по электронной почте", + "alerts.x-users-found": "Нашел %1 пользователя(ей)! Поиск занял %2 мс." } \ No newline at end of file diff --git a/public/language/ru/admin/settings/advanced.json b/public/language/ru/admin/settings/advanced.json index f989898d05..b04d3a3509 100644 --- a/public/language/ru/admin/settings/advanced.json +++ b/public/language/ru/admin/settings/advanced.json @@ -1,8 +1,8 @@ { - "maintenance-mode": "Maintenance Mode", - "maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.", + "maintenance-mode": "Режим обслуживания", + "maintenance-mode.help": "Когда форум находится в режиме обслуживания, все запросы будут перенаправляться на статичную страницу. Администраторы освобождены от этого ограничения, и имеют обычный доступ к сайту.", "maintenance-mode.message": "Maintenance Message", - "headers": "Headers", + "headers": "Заголовки", "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", "headers.powered-by": "Customise the \"Powered By\" header sent by NodeBB", "headers.acao": "Access-Control-Allow-Origin", diff --git a/public/language/ru/admin/settings/chat.json b/public/language/ru/admin/settings/chat.json index f61ea922d0..a02aebb12d 100644 --- a/public/language/ru/admin/settings/chat.json +++ b/public/language/ru/admin/settings/chat.json @@ -1,11 +1,11 @@ { "chat-settings": "Настройки Чата", "disable": "Отключить чат", - "disable-editing": "Disable chat message editing/deletion", - "disable-editing-help": "Administrators and global moderators are exempt from this restriction", - "max-length": "Maximum length of chat messages", + "disable-editing": "Отключить редактирование/удаление сообщения чата", + "disable-editing-help": "Администраторы и общие модераторы освобождены от этого ограничения.", + "max-length": "Максимальная длина сообщения чата", "max-room-size": "Максимальное число пользователей в чат комнатах", "delay": "Время между сообщениями чата в милисекундах", - "restrictions.seconds-edit-after": "Number of seconds before users are allowed to edit chat messages after posting. (0 disabled)", - "restrictions.seconds-delete-after": "Number of seconds before users are allowed to delete chat messages after posting. (0 disabled)" + "restrictions.seconds-edit-after": "Секунд перед тем, как пользователю разрешено редактировать сообщение чата после отправки. (0 выключено)", + "restrictions.seconds-delete-after": "Секунд перед тем, как пользователю разрешено удалить сообщение чата после отправки. (0 выключено)" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/post.json b/public/language/ru/admin/settings/post.json index 6594fe384b..f32937b535 100644 --- a/public/language/ru/admin/settings/post.json +++ b/public/language/ru/admin/settings/post.json @@ -1,10 +1,10 @@ { - "sorting": "Post Sorting", - "sorting.post-default": "Default Post Sorting", - "sorting.oldest-to-newest": "Oldest to Newest", - "sorting.newest-to-oldest": "Newest to Oldest", - "sorting.most-votes": "Most Votes", - "sorting.most-posts": "Most Posts", + "sorting": "Сортировка постов", + "sorting.post-default": "Сортировка постов по умолчанию", + "sorting.oldest-to-newest": "Начиная со старых записей", + "sorting.newest-to-oldest": "Начиная с новых записей", + "sorting.most-votes": "По голосам", + "sorting.most-posts": "По количеству ответов", "sorting.topic-default": "Default Topic Sorting", "length": "Post Length", "restrictions": "Posting Restrictions", diff --git a/public/language/ru/admin/settings/sockets.json b/public/language/ru/admin/settings/sockets.json index d04ee42fcf..7e2563045f 100644 --- a/public/language/ru/admin/settings/sockets.json +++ b/public/language/ru/admin/settings/sockets.json @@ -1,6 +1,6 @@ { - "reconnection": "Reconnection Settings", - "max-attempts": "Max Reconnection Attempts", - "default-placeholder": "Default: %1", - "delay": "Reconnection Delay" + "reconnection": "Настройки переподключения", + "max-attempts": "Максимально попыток переподключения", + "default-placeholder": "По умолчанию: %1", + "delay": "Задержка переподключения" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index a8b1fd607c..9f4515b24c 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -10,58 +10,58 @@ "allow-login-with.email": "Только email", "account-settings": "Настройки аккаунта", "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", - "outgoing-new-tab": "Open outgoing links in new tab", - "topic-search": "Enable In-Topic Searching", - "digest-freq": "Subscribe to Digest", - "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", - "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", - "email-post-notif": "Send an email when replies are made to topics I am subscribed to", - "follow-created-topics": "Follow topics you create", - "follow-replied-topics": "Follow topics that you reply to", - "default-notification-settings": "Default notification settings" + "disable-email-changes": "Отключить изменение email пользователя", + "disable-password-changes": "Отключить изменение пароля", + "allow-account-deletion": "Разрешить удаление аккаунта", + "user-info-private": "Спрятать список пользователей и их данные от гостей", + "hide-fullname": "Спрятать полные имена от пользователей", + "hide-email": "Спрятать email от пользователей", + "themes": "Темы", + "disable-user-skins": "Не давать пользователям выбирать сторонние цветовые схемы", + "account-protection": "Защита аккаунта", + "admin-relogin-duration": "Таймер повторного логина администратора (минут)", + "admin-relogin-duration-help": "После установки промежутка времени доступ в консоль администратора потребует повторный логин, установка 0 отменяет это.", + "login-attempts": "Попыток логина за час", + "login-attempts-help": "Если попытки логина 's превысят это значение, то аккаунт будет заблокирован на заранее установленный промежуток времени", + "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-адресов - Обычная для новый пользователей, Admin Подтверждение для 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": "Показать email", + "show-fullname": "Показать полное имя", + "restrict-chat": "Чат только с теми на кого подписался", + "outgoing-new-tab": "Открывать внешние ссылки в новом окне", + "topic-search": "Включить поиск в топике", + "digest-freq": "Подписка на дайджест", + "digest-freq.off": "Выкл", + "digest-freq.daily": "Ежедневно", + "digest-freq.weekly": "Еженедельно", + "digest-freq.monthly": "Ежемесячно", + "email-chat-notifs": "Отправлять уведомления по электронной почте при поступлении нового сообщения чата", + "email-post-notif": "Отправлять уведомления по электронной почте при появлении новых ответов в подписанных темах", + "follow-created-topics": "Следить за темами которые вы создаёте", + "follow-replied-topics": "Следить за темами в которых вы отвечаете", + "default-notification-settings": "Настройки уведомлений по умолчанию" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 8dfbe08a7d..17e2de7348 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -78,7 +78,7 @@ "still-uploading": "Пожалуйста, подождите завершения загрузки.", "file-too-big": "Слишком большой файл. Максимальный размер: %1 Кбайт.", "guest-upload-disabled": "Загрузка файлов для гостей отключена. Чтобы загрузить файл, пожалуйста, войдите или зарегистрируйтесь на сайте.", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Невозможно загрузить изображение из-за неверного CORS", "already-bookmarked": "Эта запись уже есть в закладках", "already-unbookmarked": "Эта запись уже удалена из закладок", "cant-ban-other-admins": "Вы не можете забанить других администраторов", diff --git a/public/language/ru/global.json b/public/language/ru/global.json index 3060069a43..b5d5357889 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -85,7 +85,7 @@ "language": "Язык", "guest": "Гость", "guests": "Гостей", - "former_user": "A Former User", + "former_user": "Бывший пользователь", "updated.title": "Форум обновлён", "updated.message": "Форум был обновлён до последней версии. Нажмите здесь, чтобы обновить страницу.", "privacy": "Безопасность", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 7d21affc0f..29a39e28ae 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Вы уверены, что хотите удалить это сообщение?", "chat.retrieving-users": "Получение списка пользователей...", "chat.manage-room": "Управлять комнатой чата", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Поиск пользователей здесь. Когда выбрали пользователя, он будет добавлен в чат. Новый пользователь не сможет видеть сообщения чата, написанные до его добавления в беседу. Только владельцы комнат () могут удалить пользователей из чатов.", "chat.confirm-chat-with-dnd-user": "Этот пользователь установил статус \"Не беспокоить\". Вы все еще хотите написать ему?", "chat.rename-room": "Переименовать комнату", "chat.rename-placeholder": "Введите название комнаты здесь", @@ -33,7 +33,7 @@ "chat.in-room": "В этой комнате", "chat.kick": "Исключить", "chat.show-ip": "Показать IP", - "chat.owner": "Room Owner", + "chat.owner": "Владелец комнаты", "composer.compose": "Редактор сообщений", "composer.show_preview": "Показать предпросмотр сообщения", "composer.hide_preview": "Скрыть предпросмотр", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 25948aa9cc..1bd7239b98 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -111,7 +111,7 @@ "upvote-notif-freq.all": "Все положительные отзывы", "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Каждые десять понравившихся отзывов", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "На 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "На 10, 100, 1000...", "upvote-notif-freq.disabled": "Выключено", "browsing": "Настройки просмотра", From 0c9907367a3c94b532b1e6015e572294bee65b6e Mon Sep 17 00:00:00 2001 From: smyther Date: Fri, 14 Sep 2018 15:07:01 +0100 Subject: [PATCH 167/310] Implement fix for multiple fork cards showing (#6757) --- public/src/client/topic/fork.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/src/client/topic/fork.js b/public/src/client/topic/fork.js index f4190b61ac..134a41a1ac 100644 --- a/public/src/client/topic/fork.js +++ b/public/src/client/topic/fork.js @@ -17,6 +17,10 @@ define('forum/topic/fork', ['components', 'postSelect'], function (components, p } function onForkThreadClicked() { + if (forkModal) { + return; + } + app.parseAndTranslate('partials/fork_thread_modal', {}, function (html) { forkModal = html; From b43bfa3d5bacc5d105cb89126b8c24416a5c2d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 14 Sep 2018 16:23:16 -0400 Subject: [PATCH 168/310] closes #6759 -moved user.blocks.filter from unread controller to getUnreadTopics so topics are filtered at other places this function is called - when a new post is made do not send it to uids that have blocked the poster - update getUnreadTids so it does not return topics that have new posts from blocked users - update hasReadTopics so it does not return false data if topic has new posts from blocked users --- src/controllers/unread.js | 6 ---- src/socket.io/helpers.js | 3 ++ src/topics/unread.js | 66 ++++++++++++++++++++++++++++++++++----- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/controllers/unread.js b/src/controllers/unread.js index 500cfe11a6..96dc4f66ce 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -54,12 +54,6 @@ unreadController.get = function (req, res, next) { cutoff: cutoff, }, next); }, - function (data, next) { - user.blocks.filter(req.uid, data.topics, function (err, filtered) { - data.topics = filtered; - next(err, data); - }); - }, function (data) { data.title = meta.config.homePageTitle || '[[pages:home]]'; data.pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage)); diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 163e7d54d3..907d0726c1 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -31,6 +31,9 @@ SocketHelpers.notifyNew = function (uid, type, result) { function (uids, next) { filterTidCidIgnorers(uids, result.posts[0].topic.tid, result.posts[0].topic.cid, next); }, + function (uids, next) { + user.blocks.filterUids(uid, uids, next); + }, function (uids, next) { plugins.fireHook('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type }, next); }, diff --git a/src/topics/unread.js b/src/topics/unread.js index 86d3cac56a..500b429cd2 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -6,6 +6,7 @@ var _ = require('lodash'); var db = require('../database'); var user = require('../user'); +var posts = require('../posts'); var notifications = require('../notifications'); var categories = require('../categories'); var privileges = require('../privileges'); @@ -150,7 +151,6 @@ module.exports = function (Topics) { ], callback); }; - function filterTopics(uid, tids, cid, filter, callback) { if (!tids.length) { return callback(null, tids); @@ -181,15 +181,53 @@ module.exports = function (Topics) { }, function (results, next) { var topics = results.topics; + cid = cid && cid.map(String); - tids = topics.filter(function (topic, index) { + topics = topics.filter(function (topic, index) { return topic && topic.cid && (!!results.isTopicsFollowed[index] || results.ignoredCids.indexOf(topic.cid.toString()) === -1) && (!cid || (cid.length && cid.indexOf(String(topic.cid)) !== -1)); - }).map(function (topic) { - return topic.tid; }); - next(null, tids); + + user.blocks.filter(uid, topics, next); + }, + function (filteredTopics, next) { + tids = filteredTopics.map(function (topic) { + return topic && topic.tid; + }); + filterTidsThatHaveBlockedPosts(uid, tids, next); + }, + ], callback); + } + + function filterTidsThatHaveBlockedPosts(uid, tids, callback) { + async.filter(tids, function (tid, next) { + doesTidHaveUnblockedUnreadPosts(uid, tid, next); + }, callback); + } + + function doesTidHaveUnblockedUnreadPosts(uid, tid, callback) { + async.waterfall([ + function (next) { + db.sortedSetScore('uid:' + uid + ':tids_read', tid, next); + }, + function (userLastReadTimestamp, next) { + if (!userLastReadTimestamp) { + return callback(null, true); + } + db.getSortedSetRevRangeByScore('tid:' + tid + ':posts', 0, -1, '+inf', userLastReadTimestamp, next); + }, + function (pidsSinceLastVisit, next) { + if (!pidsSinceLastVisit.length) { + return callback(null, false); + } + posts.getPostsFields(pidsSinceLastVisit, ['pid', 'uid'], next); + }, + function (postData, next) { + user.blocks.filter(uid, postData, next); + }, + function (unreadPosts, next) { + next(null, unreadPosts.length > 0); }, ], callback); } @@ -347,12 +385,26 @@ module.exports = function (Topics) { function (results, next) { var cutoff = Topics.unreadCutoff(); var result = tids.map(function (tid, index) { - return !results.tids_unread[index] && + var read = !results.tids_unread[index] && (results.recentScores[index] < cutoff || !!(results.userScores[index] && results.userScores[index] >= results.recentScores[index])); + return { tid: tid, read: read }; }); - next(null, result); + async.map(result, function (data, next) { + if (data.read) { + return next(null, true); + } + doesTidHaveUnblockedUnreadPosts(uid, data.tid, function (err, hasUnblockedUnread) { + if (err) { + return next(err); + } + if (!hasUnblockedUnread) { + data.read = true; + } + next(null, data.read); + }); + }, next); }, ], callback); }; From 08dfb3470c6fd77a9b51f6360a9fb1cc18bd565a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 14 Sep 2018 18:00:52 -0400 Subject: [PATCH 169/310] fix tests --- src/topics/unread.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/topics/unread.js b/src/topics/unread.js index 500b429cd2..cb197fac21 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -207,11 +207,18 @@ module.exports = function (Topics) { } function doesTidHaveUnblockedUnreadPosts(uid, tid, callback) { + var topicTimestamp; + var userLastReadTimestamp; async.waterfall([ function (next) { - db.sortedSetScore('uid:' + uid + ':tids_read', tid, next); + async.parallel({ + topicTimestamp: async.apply(db.sortedSetScore, 'topics:recent', tid), + userLastReadTimestamp: async.apply(db.sortedSetScore, 'uid:' + uid + ':tids_read', tid), + }, next); }, - function (userLastReadTimestamp, next) { + function (results, next) { + topicTimestamp = results.topicTimestamp; + userLastReadTimestamp = results.userLastReadTimestamp; if (!userLastReadTimestamp) { return callback(null, true); } @@ -219,7 +226,7 @@ module.exports = function (Topics) { }, function (pidsSinceLastVisit, next) { if (!pidsSinceLastVisit.length) { - return callback(null, false); + return callback(null, topicTimestamp > userLastReadTimestamp); } posts.getPostsFields(pidsSinceLastVisit, ['pid', 'uid'], next); }, From 3a36a2b53b9f4b224190f3e003db90c3840b3b2f Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 15 Sep 2018 09:31:17 +0000 Subject: [PATCH 170/310] Latest translations and fallbacks --- public/language/he/register.json | 6 +++--- public/language/he/reset_password.json | 2 +- public/language/he/topic.json | 8 ++++---- public/language/sk/admin/advanced/database.json | 4 ++-- public/language/sk/admin/manage/categories.json | 2 +- public/language/sk/admin/settings/advanced.json | 10 +++++----- public/language/sk/admin/settings/uploads.json | 4 ++-- public/language/sk/email.json | 4 ++-- public/language/sk/error.json | 2 +- public/language/sk/global.json | 2 +- public/language/sk/groups.json | 2 +- public/language/sk/modules.json | 4 ++-- public/language/sk/pages.json | 8 ++++---- public/language/sk/user.json | 8 ++++---- 14 files changed, 33 insertions(+), 33 deletions(-) diff --git a/public/language/he/register.json b/public/language/he/register.json index d0bb3ed891..d6c9331a51 100644 --- a/public/language/he/register.json +++ b/public/language/he/register.json @@ -20,7 +20,7 @@ "registration-added-to-queue": "הבקשה שלך להרשמה נשלחה. תקבל בקרוב מייל אישור לכתובת האימייל שהכנסת כשמנהל יאשר את הבקשה.", "interstitial.intro": "אנו דורשים מידע נוסף לפני שנוכל ליצור עבורך את החשבון.", "interstitial.errors-found": "לא הצלחנו להשלים את הרישום שלך:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "אני מסכים שפורום זה יאגור ויעבד את נתוני האישיים", + "gdpr_agree_email": "אני מסכים לקבל מדי פעם מיילים מפורום זה עם סיכום נושאים מעניינים שפורסמו", + "gdpr_consent_denied": "אתה מוכרח להסכים לתנאים על מנת להרשם" } \ No newline at end of file diff --git a/public/language/he/reset_password.json b/public/language/he/reset_password.json index 0f69a64e15..c60a2ccd39 100644 --- a/public/language/he/reset_password.json +++ b/public/language/he/reset_password.json @@ -9,7 +9,7 @@ "repeat_password": "אמת סיסמה", "enter_email": "אנא הקלד את כתובת האימייל שלך ואנו נשלח לך הוראות כיצד לאפס את חשבונך", "enter_email_address": "הכנס כתובת אימייל", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "password_reset_sent": "אימייל לשחזור הסיסמה נשלח לכתובת שהוגדרה. שים לב שרק מייל שחזור אחד ישלח כל דקה.", "invalid_email": "מייל שגוי / כתובת מייל לא נמצאה", "password_too_short": "הסיסמה שבחרת קצרה מדי, אנא בחר סיסמה שונה.", "passwords_do_not_match": "הסיסמאות שהזנת אינן תואמות.", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 356e921f6f..0522294f67 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -93,7 +93,7 @@ "fork_topic": "שכפל נושא", "fork_topic_instruction": "לחץ על הפוסטים שברצונך לשכפל", "fork_no_pids": "לא בחרת אף פוסט!", - "fork_pid_count": "%1 post(s) selected", + "fork_pid_count": "%1 פוסט(ים) נבחרו", "fork_success": "הפוסט שוכפל בהצלחה! לחץ כאן על מנת לעבור לפוסט המשוכפל.", "delete_posts_instruction": "לחץ על הפוסטים שברצונך למחוק", "merge_topics_instruction": "לחץ על הנושאים שתרצה למזג", @@ -118,14 +118,14 @@ "sort_by": "סדר על-פי", "oldest_to_newest": "מהישן לחדש", "newest_to_oldest": "מהחדש לישן", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "הכי הרבה הצבעות", + "most_posts": "הכי הרבה פוסטים", "stale.title": "פתח נושא חדש במקום?", "stale.warning": "הנושא בו אתה מגיב הוא דיי ישן. האם ברצונך לפתוח נושא חדש, ולהזכיר את הנושא הזה בתגובתך?", "stale.create": "צור נושא חדש", "stale.reply_anyway": "הגב לנושא זה בכל מקרה", "link_back": "תגובה: [%1](%2)", - "diffs.title": "Post Edit History", + "diffs.title": "היסטוריית עריכת הפוסט", "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", "diffs.no-revisions-description": "לפוסט זה יש %1גרסאות", "diffs.current-revision": "current revision", diff --git a/public/language/sk/admin/advanced/database.json b/public/language/sk/admin/advanced/database.json index cb03163a41..cf95aec279 100644 --- a/public/language/sk/admin/advanced/database.json +++ b/public/language/sk/admin/advanced/database.json @@ -35,6 +35,6 @@ "redis.raw-info": "Informácie Redis Raw", "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", - "postgres.raw-info": "Postgres Raw Info" + "postgres.version": "Verzia PostgreSQL", + "postgres.raw-info": "Informácie o Postgres" } diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 12ab263115..3c2785223b 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -19,7 +19,7 @@ "parent-category-none": "(nič)", "copy-settings": "Kopírovať nastavenia z", "optional-clone-settings": "Klonovať nastavenia z kategórie (odporúčané)", - "clone-children": "Clone Children Categories And Settings", + "clone-children": "Duplikovať podružné kategórie a nastavenia", "purge": "Vyčistiť kategóriu", "enable": "Povoliť", diff --git a/public/language/sk/admin/settings/advanced.json b/public/language/sk/admin/settings/advanced.json index 01bb352312..13ade8d83c 100644 --- a/public/language/sk/admin/settings/advanced.json +++ b/public/language/sk/admin/settings/advanced.json @@ -12,11 +12,11 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", - "hsts": "Strict Transport Security", - "hsts.enabled": "Enabled HSTS (recommended)", - "hsts.subdomains": "Include subdomains in HSTS header", - "hsts.preload": "Allow preloading of HSTS header", - "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", + "hsts": "Prísne zabezpečenie prenosu", + "hsts.enabled": "Povoliť HSTS (odporúčané)", + "hsts.subdomains": "Zahrnúť pod domény v hlavičke HSTS", + "hsts.preload": "Povoliť pred načítavanie hlavičky HSTS", + "hsts.help": "Ak je povolené, bude nastavená pre tieto stránky hlavička HSTS. V hlavičke si môžete zvoliť aj zahrnutie pod domén a prednastavených príznakov. Ak si nieste istý, nechajte nezaškrtnuté Viac informácií ", "traffic-management": "Správa prevádzky", "traffic.help": "NodeBB obsahuje modul, ktorý automaticky zamieta požiadavky pri vysokom vyťažení. Toto nastavenie môžete upraviť tu, hoci východiskové hodnoty sú zaručením úspechu.", "traffic.enable": "Povoliť správu prevádzky", diff --git a/public/language/sk/admin/settings/uploads.json b/public/language/sk/admin/settings/uploads.json index bf7a2c7a33..e22df102f5 100644 --- a/public/language/sk/admin/settings/uploads.json +++ b/public/language/sk/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "Príspevky", "allow-files": "Umožniť používateľom nahrávať bežné súbory", "private": "Nahrané súbory sú súkromné", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "Prípona súborov je súkromná", + "private-uploads-extensions-help": "Pre nastavenie súkromia, zadajte sem zoznam súborov oddelených čiarkou (napr.: pdf,xls,doc). Prázdny zoznam znamená, že všetky súbory sú súkromné.", "max-image-width": "Zmenšiť veľkosť obrázkov na potrebné rozlíšenie (v pixeloch)", "max-image-width-help": "(v pixeloch, predvolené: 760 pixelov, pre zákaz nastavte 0)", "resize-image-quality": "Kvalita pri zmene veľkosti obrázkov", diff --git a/public/language/sk/email.json b/public/language/sk/email.json index 3478cb08b0..f371cd44c1 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -4,8 +4,8 @@ "invite": "Pozvánka od %1", "greeting_no_name": "Dobrý deň", "greeting_with_name": "Dobrý deň %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Overte si prosím, vašu e-mailovú adresu", + "email.verify.text1": "Vaša e-mailová adresa bola zmenená", "welcome.text1": "Ďakujeme Vám za registráciu s %1!", "welcome.text2": "Pre úplne aktivovanie Vášho účtu, musíme overiť e-mailovú adresu, ktorú ste zadali pri registrácií.", "welcome.text3": "Správca práve potvrdil vašu registráciu. Teraz sa môžete prihlásiť svojím menom a heslom.", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 6f8a9ea066..1cf7914c31 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -78,7 +78,7 @@ "still-uploading": "Prosím čakajte na dokončenie nahrávania", "file-too-big": "Najväčšia povolená veľkosť obrázka je %1 kB - prosím nahrajte menší súbor", "guest-upload-disabled": "Nahrávanie pre hostí bolo zablokované", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "Nieje možné nahrať obrázok kvôli zle nastavenému „Cross-Origin Resource Sharing (CORS)”", "already-bookmarked": "Tento príspevok máte už medzi záložkami", "already-unbookmarked": "Tento príspevok už nemáte medzi záložkami", "cant-ban-other-admins": "Nemôžte zablokovať iných správcov.", diff --git a/public/language/sk/global.json b/public/language/sk/global.json index 2537129a66..994d590038 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -85,7 +85,7 @@ "language": "Jazyk", "guest": "Hosť", "guests": "Hostia", - "former_user": "A Former User", + "former_user": "Bývalý používateľ", "updated.title": "Fórum bolo aktualizované", "updated.message": "Toto fórum bolo práve aktualizované na najnovšiu verziu. Pre aktualizovanie tejto stránky kliknite sem.", "privacy": "Súkromie", diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index ef05d9e9d6..bbff2cdf47 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -28,7 +28,7 @@ "details.grant": "Pridať/Zrušiť vlastníctvo", "details.kick": "Vyhodiť", "details.kick_confirm": "Ste si naozaj istý, že chcete odstrániť tohto člena zo skupiny?", - "details.add-member": "Add Member", + "details.add-member": "Pridať používateľa", "details.owner_options": "Správca skupiny", "details.group_name": "Názov skupiny", "details.member_count": "Počet členov", diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index 65bf7638e8..87268ff4c5 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -22,7 +22,7 @@ "chat.delete_message_confirm": "Ste si istý, že chcete odstrániť túto správu?", "chat.retrieving-users": "Získavanie zoznamu používateľov...", "chat.manage-room": "Spravovať konverzačné miestnosti", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Tu môžete vyhľadávať používateľov. Akonáhle si ho vyberiete, užívateľ bude pridaný do konverzácie. Nový používateľ nebude mať možnosť čítať správy, ktoré boli napísané skôr, ako bol pridaný do konverzácie. Iba majitelia miestnosti () môžu odobrať používateľov z konverzačných miestností.", "chat.confirm-chat-with-dnd-user": "Tento používateľ nastavil svoj stav na NERUŠIŤ. Naozaj chcete s ním začať konverzáciu?", "chat.rename-room": "Premenovať miestnosť", "chat.rename-placeholder": "Sem zadajte názov miestnosti", @@ -33,7 +33,7 @@ "chat.in-room": "V tejto miestnosti", "chat.kick": "Vykopnúť", "chat.show-ip": "Zobraziť IP adresu", - "chat.owner": "Room Owner", + "chat.owner": "Majiteľ miestnosti", "composer.compose": "Napísať", "composer.show_preview": "Zobraziť náhľad", "composer.hide_preview": "Skryť náhľad", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index f5ff228f24..114547d610 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -6,10 +6,10 @@ "popular-month": "Populárne témy za tento mesiac", "popular-alltime": "Populárne témy za celé obdobie", "recent": "Nedávne témy", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Dnešná téma s najviac súhlasmi", + "top-week": "Týždenná téma s najviac súhlasmi", + "top-month": "Mesačná téma s najviac súhlasmi", + "top-alltime": "Témy s najviac súhlasmi", "moderator-tools": "Nástroje moderátora", "flagged-content": "Nahlásený obsah", "ip-blacklist": "Čierny zoznam IP adries", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 720c6959c6..428c7a6798 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -31,8 +31,8 @@ "following": "Nasleduje", "blocks": "Zablokovaný", "block_toggle": "Prepnúť zablokovanie", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Zablokovať používateľa", + "unblock_user": "Odblokovať používateľa", "aboutme": "O mne", "signature": "Podpis", "birthday": "Dátum narodenia", @@ -109,9 +109,9 @@ "no-sound": "Žiadny zvuk", "upvote-notif-freq": "Frekvencia upozornení na súhlasy", "upvote-notif-freq.all": "Všetky súhlasy", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "Prvý podľa príspevku", "upvote-notif-freq.everyTen": "Každý desiaty súhlas", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "Podľa 1, 5, 10, 25, 50, 100, 150, 200, ...", "upvote-notif-freq.logarithmic": "Podľa 10, 100, 1000...", "upvote-notif-freq.disabled": "Zakázané", "browsing": "Nastavenia prehľadávania", From c0b96a402ecc6950b928f327ce9f99f3a507595b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 15 Sep 2018 20:34:05 +0000 Subject: [PATCH 171/310] Update dependency jimp to v0.5.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 8b16e0197a..1d1980eb98 100644 --- a/install/package.json +++ b/install/package.json @@ -51,7 +51,7 @@ "helmet": "^3.11.0", "html-to-text": "^4.0.0", "ipaddr.js": "^1.5.4", - "jimp": "0.4.0", + "jimp": "0.5.0", "jquery": "^3.2.1", "jsesc": "2.5.1", "json-2-csv": "^2.1.2", From 7bde09f645cbe530590bf4a039d32d1aed64db10 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 15 Sep 2018 17:31:48 -0400 Subject: [PATCH 172/310] update issue template to show postgres version command --- .github/ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 27c7ace0a9..49f0a84909 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -12,7 +12,7 @@ - **Database type:** mongo, redis, or postgres - **Database version:** - + - **Exact steps to cause this issue:** ', nested[i].html())); - } + nested.forEach(function (nestedEl, i) { + result.html(result.html().replace('', function () { + return nestedEl.html(); + })); + }); }); $('.search-result-text').find('img:not(.not-responsive)').addClass('img-responsive'); diff --git a/public/src/modules/search.js b/public/src/modules/search.js index f135271d50..ea0f775fd1 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -7,24 +7,14 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat }; Search.query = function (data, callback) { - var term = data.term; - // Detect if a tid was specified - var topicSearch = term.match(/^in:topic-([\d]+) /); + var topicSearch = data.term.match(/^in:topic-([\d]+) /); if (!topicSearch) { - term = term.replace(/^[ ?#]*/, ''); - - try { - term = encodeURIComponent(term); - } catch (e) { - return app.alertError('[[error:invalid-search-term]]'); - } - ajaxify.go('search?' + createQueryString(data)); callback(); } else { - var cleanedTerm = term.replace(topicSearch[0], ''); + var cleanedTerm = data.term.replace(topicSearch[0], ''); var tid = topicSearch[1]; if (cleanedTerm.length > 0) { @@ -36,8 +26,15 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat function createQueryString(data) { var searchIn = data.in || 'titlesposts'; var postedBy = data.by || ''; + var term = data.term.replace(/^[ ?#]*/, ''); + try { + term = encodeURIComponent(term); + } catch (e) { + return app.alertError('[[error:invalid-search-term]]'); + } + var query = { - term: data.term, + term: term, in: searchIn, }; From 27a90b7a787d3a4c9a77f68c1297aaaec4b5cdd7 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 19 Sep 2018 09:26:25 +0000 Subject: [PATCH 185/310] Latest translations and fallbacks --- public/language/bg/pages.json | 2 +- public/language/fr/pages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index ffe3881d12..adae242dd9 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -54,7 +54,7 @@ "account/best": "Най-добрите публикации от %1", "account/blocks": "Блокирани потребители за %1", "account/uploads": "Качвания от %1", - "account/sessions": "Login Sessions", + "account/sessions": "Сесии на вписване", "confirm": "Е-пощата е потвърдена", "maintenance.text": "%1 в момента е в профилактика. Моля, върнете се по-късно.", "maintenance.messageIntro": "В допълнение, администраторът е оставил това съобщение:", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index fab00c3b92..6f78252a69 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -54,7 +54,7 @@ "account/best": "Meilleurs messages postés par %1", "account/blocks": "Utilisateurs bloqués pour %1", "account/uploads": "Envoyé par %1", - "account/sessions": "Login Sessions", + "account/sessions": "Sessions des connexions", "confirm": "Email vérifié", "maintenance.text": "%1 est en maintenance. Veuillez revenir un peu plus tard.", "maintenance.messageIntro": "De plus, l'administrateur a laissé ce message :", From 669a5135e164eb1feb64ee691c23a20f1a4a7ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 19 Sep 2018 14:38:07 -0400 Subject: [PATCH 186/310] closes #6768 --- public/language/en-GB/admin/manage/users.json | 2 +- public/language/en-GB/users.json | 1 + public/src/client/users.js | 2 +- src/socket.io/user.js | 14 ++++++-------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/public/language/en-GB/admin/manage/users.json b/public/language/en-GB/admin/manage/users.json index 2e4cfa2a5c..6a17cbf016 100644 --- a/public/language/en-GB/admin/manage/users.json +++ b/public/language/en-GB/admin/manage/users.json @@ -93,7 +93,7 @@ "alerts.error-x": "Error

%1

", "alerts.create-success": "User created!", - "alerts.prompt-email": "Email: ", + "alerts.prompt-email": "Emails: ", "alerts.email-sent-to": "An invitation email has been sent to %1", "alerts.x-users-found": "%1 user(s) found! Search took %2 ms." } \ No newline at end of file diff --git a/public/language/en-GB/users.json b/public/language/en-GB/users.json index 5c9d8b93a4..18cf03fde3 100644 --- a/public/language/en-GB/users.json +++ b/public/language/en-GB/users.json @@ -10,6 +10,7 @@ "filter-by": "Filter By", "online-only": "Online only", "invite": "Invite", + "prompt-email": "Emails:", "invitation-email-sent": "An invitation email has been sent to %1", "user_list": "User List", "recent_topics": "Recent Topics", diff --git a/public/src/client/users.js b/public/src/client/users.js index 3d541e0863..bf6873e693 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -130,7 +130,7 @@ define('forum/users', ['translator', 'benchpress'], function (translator, Benchp function handleInvite() { $('[component="user/invite"]').on('click', function () { - bootbox.prompt('Email: ', function (email) { + bootbox.prompt('[[users:prompt-email]]', function (email) { if (!email) { return; } diff --git a/src/socket.io/user.js b/src/socket.io/user.js index ece95c875e..582262b20d 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -289,21 +289,19 @@ SocketUser.invite = function (socket, email, callback) { return next(new Error('[[error:no-privileges]]')); } - var max = parseInt(meta.config.maximumInvites, 10); - if (!max) { - return user.sendInvitationEmail(socket.uid, email, callback); - } - async.waterfall([ function (next) { user.getInvitesNumber(socket.uid, next); }, function (invites, next) { - if (!isAdmin && invites >= max) { + var max = parseInt(meta.config.maximumInvites, 10); + if (!isAdmin && max && invites >= max) { return next(new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); } - - user.sendInvitationEmail(socket.uid, email, next); + email = email.split(',').map(email => email.trim()).filter(Boolean); + async.eachSeries(email, function (email, next) { + user.sendInvitationEmail(socket.uid, email, next); + }, next); }, ], next); }, From c4b23909dfab25ac8b5a704bc2914630349c26ac Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 20 Sep 2018 09:26:39 +0000 Subject: [PATCH 187/310] Latest translations and fallbacks --- public/language/sr/pages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index 6454142f72..3e2c8276d5 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -54,7 +54,7 @@ "account/best": "Најбоље поруке од %1", "account/blocks": "Корисници које је блокирао %1", "account/uploads": "Отпремио %1", - "account/sessions": "Login Sessions", + "account/sessions": "Сесије пријављивања", "confirm": "Е-пошта је потврђена.", "maintenance.text": "%1 је тренутно у фази одржавања. Молимо, навратите касније.", "maintenance.messageIntro": "Додатно, администратор је оставио ову поруку:", From 69c7260fe90ff38654594f7697cef6af4f2fe6e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 20 Sep 2018 11:55:53 -0400 Subject: [PATCH 188/310] dont let sending more than max invites via bulk invite --- src/socket.io/user.js | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 582262b20d..81182bdd09 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -288,22 +288,26 @@ SocketUser.invite = function (socket, email, callback) { if (registrationType === 'admin-invite-only' && !isAdmin) { return next(new Error('[[error:no-privileges]]')); } + var max = parseInt(meta.config.maximumInvites, 10); + email = email.split(',').map(email => email.trim()).filter(Boolean); + async.eachSeries(email, function (email, next) { + async.waterfall([ + function (next) { + if (max) { + user.getInvitesNumber(socket.uid, next); + } else { + next(null, 0); + } + }, + function (invites, next) { + if (!isAdmin && max && invites >= max) { + return next(new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); + } - async.waterfall([ - function (next) { - user.getInvitesNumber(socket.uid, next); - }, - function (invites, next) { - var max = parseInt(meta.config.maximumInvites, 10); - if (!isAdmin && max && invites >= max) { - return next(new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); - } - email = email.split(',').map(email => email.trim()).filter(Boolean); - async.eachSeries(email, function (email, next) { user.sendInvitationEmail(socket.uid, email, next); - }, next); - }, - ], next); + }, + ], next); + }, next); }, ], callback); }; From b7ead6dc9cf3349e2d71f52fca45907d53f6cfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 20 Sep 2018 17:05:52 -0400 Subject: [PATCH 189/310] Replace jimp with sharp (#6774) * add probe image size and max image size * replace jimp and image-probe with sharp * better name for test * resize with just path * resize thumb inplace * use filename --- install/package.json | 2 +- .../en-GB/admin/settings/uploads.json | 4 + public/language/en-GB/error.json | 1 + src/controllers/admin/uploads.js | 30 ++--- src/controllers/uploads.js | 13 +- src/file.js | 18 ++- src/groups/cover.js | 23 +--- src/image.js | 118 +++++++----------- src/topics/thumb.js | 1 - src/upgrades/1.6.0/generate-email-logo.js | 1 - src/user/picture.js | 2 - src/views/admin/settings/uploads.tpl | 18 ++- test/files/brokenimage.png | Bin 0 -> 7482 bytes test/files/notanimage.png | 1 + test/files/toobig.jpg | Bin 0 -> 4856 bytes test/uploads.js | 34 +++++ 16 files changed, 140 insertions(+), 126 deletions(-) create mode 100644 test/files/brokenimage.png create mode 100644 test/files/notanimage.png create mode 100644 test/files/toobig.jpg diff --git a/install/package.json b/install/package.json index 461f4be496..8fab478da4 100644 --- a/install/package.json +++ b/install/package.json @@ -51,7 +51,6 @@ "helmet": "^3.11.0", "html-to-text": "^4.0.0", "ipaddr.js": "^1.5.4", - "jimp": "0.5.0", "jquery": "^3.2.1", "jsesc": "2.5.1", "json-2-csv": "^2.1.2", @@ -97,6 +96,7 @@ "sanitize-html": "^1.16.3", "semver": "^5.4.1", "serve-favicon": "^2.4.5", + "sharp": "0.20.8", "sitemap": "^1.13.0", "socket.io": "2.1.1", "socket.io-adapter-cluster": "^1.0.1", diff --git a/public/language/en-GB/admin/settings/uploads.json b/public/language/en-GB/admin/settings/uploads.json index e0382bd8da..83a0c73428 100644 --- a/public/language/en-GB/admin/settings/uploads.json +++ b/public/language/en-GB/admin/settings/uploads.json @@ -10,6 +10,10 @@ "resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.", "max-file-size": "Maximum File Size (in KiB)", "max-file-size-help": "(in kibibytes, default: 2048 KiB)", + "reject-image-width": "Maximum Image Width (in pixels)", + "reject-image-width-help": "Images wider than this value will be rejected.", + "reject-image-height": "Maximum Image Height (in pixels)", + "reject-image-height-help": "Images taller than this value will be rejected.", "allow-topic-thumbnails": "Allow users to upload topic thumbnails", "topic-thumb-size": "Topic Thumb Size", "allowed-file-extensions": "Allowed File Extensions", diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index e3cfab6efa..6308bb6183 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -105,6 +105,7 @@ "invalid-image-type": "Invalid image type. Allowed types are: %1", "invalid-image-extension": "Invalid image extension", "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-image-dimensions": "Image dimensions are too big", "group-name-too-short": "Group name too short", "group-name-too-long": "Group name too long", diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 21dbbbca99..c7952ee98c 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -5,7 +5,6 @@ var async = require('async'); var nconf = require('nconf'); var mime = require('mime'); var fs = require('fs'); -var jimp = require('jimp'); var meta = require('../../meta'); var posts = require('../../posts'); @@ -177,16 +176,13 @@ uploadsController.uploadTouchIcon = function (req, res, next) { } // Resize the image into squares for use as touch icons at various DPIs - async.each(sizes, function (size, next) { - async.series([ - async.apply(file.saveFileToLocal, 'touchicon-' + size + '.png', 'system', uploadedFile.path), - async.apply(image.resizeImage, { - path: path.join(nconf.get('upload_path'), 'system', 'touchicon-' + size + '.png'), - extension: 'png', - width: size, - height: size, - }), - ], next); + async.eachSeries(sizes, function (size, next) { + image.resizeImage({ + path: uploadedFile.path, + target: path.join(nconf.get('upload_path'), 'system', 'touchicon-' + size + '.png'), + width: size, + height: size, + }, next); }, function (err) { file.delete(uploadedFile.path); @@ -291,7 +287,6 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) { async.apply(image.resizeImage, { path: uploadedFile.path, target: uploadPath, - extension: 'png', height: 50, }), async.apply(meta.configs.set, 'brand:emailLogo', path.join(nconf.get('upload_url'), 'system/site-logo-x50.png')), @@ -299,15 +294,16 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) { next(err, imageData); }); } else if (path.basename(filename, path.extname(filename)) === 'og:image' && folder === 'system') { - jimp.read(imageData.path).then(function (image) { + image.size(imageData.path, function (err, size) { + if (err) { + next(err); + } meta.configs.setMultiple({ - 'og:image:height': image.bitmap.height, - 'og:image:width': image.bitmap.width, + 'og:image:width': size.width, + 'og:image:height': size.height, }, function (err) { next(err, imageData); }); - }).catch(function (err) { - next(err); }); } else { setImmediate(next, null, imageData); diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index f837d58529..20431d5e3c 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -25,7 +25,7 @@ uploadsController.upload = function (req, res, filesIterator) { files = files[0]; } - async.map(files, filesIterator, function (err, images) { + async.mapSeries(files, filesIterator, function (err, images) { deleteTempFiles(files); if (err) { @@ -56,6 +56,9 @@ function uploadAsImage(req, uploadedFile, callback) { if (!canUpload) { return next(new Error('[[error:no-privileges]]')); } + image.checkDimensions(uploadedFile.path, next); + }, + function (next) { if (plugins.hasListeners('filter:uploadImage')) { return plugins.fireHook('filter:uploadImage', { image: uploadedFile, @@ -113,14 +116,9 @@ function resizeImage(fileObj, callback) { return callback(null, fileObj); } - var dirname = path.dirname(fileObj.path); - var extname = path.extname(fileObj.path); - var basename = path.basename(fileObj.path, extname); - image.resizeImage({ path: fileObj.path, - target: path.join(dirname, basename + '-resized' + extname), - extension: extname, + target: file.appendToFileName(fileObj.path, '-resized'), width: parseInt(meta.config.maximumImageWidth, 10) || 760, quality: parseInt(meta.config.resizeImageQuality, 10) || 60, }, next); @@ -157,7 +155,6 @@ uploadsController.uploadThumb = function (req, res, next) { var size = parseInt(meta.config.topicThumbSize, 10) || 120; image.resizeImage({ path: uploadedFile.path, - extension: path.extname(uploadedFile.name), width: size, height: size, }, next); diff --git a/src/file.js b/src/file.js index 3f0aaabcf0..a4dd98212d 100644 --- a/src/file.js +++ b/src/file.js @@ -4,7 +4,7 @@ var fs = require('fs'); var nconf = require('nconf'); var path = require('path'); var winston = require('winston'); -var jimp = require('jimp'); +var sharp = require('sharp'); var mkdirp = require('mkdirp'); var mime = require('mime'); var graceful = require('graceful-fs'); @@ -107,12 +107,22 @@ file.isFileTypeAllowed = function (path, callback) { }); } - // Attempt to read the file, if it passes, file type is allowed - jimp.read(path, function (err) { + sharp(path, { + failOnError: true, + }).metadata(function (err) { callback(err); }); }; +// https://stackoverflow.com/a/31205878/583363 +file.appendToFileName = function (filename, string) { + var dotIndex = filename.lastIndexOf('.'); + if (dotIndex === -1) { + return filename + string; + } + return filename.substring(0, dotIndex) + string + filename.substring(dotIndex); +}; + file.allowedExtensions = function () { var meta = require('./meta'); var allowedExtensions = (meta.config.allowedFileExtensions || '').trim(); @@ -163,7 +173,7 @@ file.existsSync = function (path) { file.delete = function (path, callback) { callback = callback || function () {}; if (!path) { - return callback(); + return setImmediate(callback); } fs.unlink(path, function (err) { if (err) { diff --git a/src/groups/cover.js b/src/groups/cover.js index 289ee16302..ae2f86c90f 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -2,7 +2,6 @@ var async = require('async'); var path = require('path'); -var Jimp = require('jimp'); var mime = require('mime'); var db = require('../database'); @@ -27,7 +26,6 @@ module.exports = function (Groups) { var tempPath = data.file ? data.file : ''; var url; var type = data.file ? mime.getType(data.file) : 'image/png'; - async.waterfall([ function (next) { if (tempPath) { @@ -49,7 +47,10 @@ module.exports = function (Groups) { Groups.setGroupField(data.groupName, 'cover:url', url, next); }, function (next) { - resizeCover(tempPath, next); + image.resizeImage({ + path: tempPath, + width: 358, + }, next); }, function (next) { uploadsController.uploadGroupCover(uid, { @@ -74,22 +75,6 @@ module.exports = function (Groups) { }); }; - function resizeCover(path, callback) { - async.waterfall([ - function (next) { - new Jimp(path, next); - }, - function (image, next) { - image.resize(358, Jimp.AUTO, next); - }, - function (image, next) { - image.write(path, next); - }, - ], function (err) { - callback(err); - }); - } - Groups.removeCover = function (data, callback) { db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position'], callback); }; diff --git a/src/image.js b/src/image.js index f99a73e3bc..afb4427590 100644 --- a/src/image.js +++ b/src/image.js @@ -3,9 +3,14 @@ var os = require('os'); var fs = require('fs'); var path = require('path'); -var Jimp = require('jimp'); -var async = require('async'); var crypto = require('crypto'); +var async = require('async'); + +var sharp = require('sharp'); +if (os.platform() === 'win32') { + // https://github.com/lovell/sharp/issues/1259 + sharp.cache(false); +} var file = require('./file'); var plugins = require('./plugins'); @@ -17,7 +22,6 @@ image.resizeImage = function (data, callback) { plugins.fireHook('filter:image.resize', { path: data.path, target: data.target, - extension: data.extension, width: data.width, height: data.height, quality: data.quality, @@ -25,64 +29,25 @@ image.resizeImage = function (data, callback) { callback(err); }); } else { - new Jimp(data.path, function (err, image) { - if (err) { - return callback(err); - } + async.waterfall([ + function (next) { + fs.readFile(data.path, next); + }, + function (buffer, next) { + var sharpImage = sharp(buffer, { + failOnError: true, + }); + sharpImage.rotate(); // auto-orients based on exif data + sharpImage.resize(data.hasOwnProperty('width') ? data.width : null, data.hasOwnProperty('height') ? data.height : null); - var w = image.bitmap.width; - var h = image.bitmap.height; - var origRatio = w / h; - var desiredRatio = data.width && data.height ? data.width / data.height : origRatio; - var x = 0; - var y = 0; - var crop; - - if (image._exif && image._exif.tags && image._exif.tags.Orientation) { - image.exifRotate(); - } - - if (origRatio !== desiredRatio) { - if (desiredRatio > origRatio) { - desiredRatio = 1 / desiredRatio; + if (data.quality) { + sharpImage.jpeg({ quality: data.quality }); } - if (origRatio >= 1) { - y = 0; // height is the smaller dimension here - x = Math.floor((w / 2) - (h * desiredRatio / 2)); - crop = async.apply(image.crop.bind(image), x, y, h * desiredRatio, h); - } else { - x = 0; // width is the smaller dimension here - y = Math.floor((h / 2) - (w * desiredRatio / 2)); - crop = async.apply(image.crop.bind(image), x, y, w, w * desiredRatio); - } - } else { - // Simple resize given either width, height, or both - crop = async.apply(setImmediate); - } - async.waterfall([ - crop, - function (_image, next) { - if (typeof _image === 'function' && !next) { - next = _image; - _image = image; - } - - if ((data.width && data.height) || (w > data.width) || (h > data.height)) { - _image.resize(data.width || Jimp.AUTO, data.height || Jimp.AUTO, next); - } else { - next(null, image); - } - }, - function (image, next) { - if (data.quality) { - image.quality(data.quality); - } - image.write(data.target || data.path, next); - }, - ], function (err) { - callback(err); - }); + sharpImage.toFile(data.target || data.path, next); + }, + ], function (err) { + callback(err); }); } }; @@ -91,21 +56,13 @@ image.normalise = function (path, extension, callback) { if (plugins.hasListeners('filter:image.normalise')) { plugins.fireHook('filter:image.normalise', { path: path, - extension: extension, }, function (err) { callback(err, path + '.png'); }); } else { - async.waterfall([ - function (next) { - new Jimp(path, next); - }, - function (image, next) { - image.write(path + '.png', function (err) { - next(err, path + '.png'); - }); - }, - ], callback); + sharp(path, { failOnError: true }).png().toFile(path + '.png', function (err) { + callback(err, path + '.png'); + }); } }; @@ -114,15 +71,32 @@ image.size = function (path, callback) { plugins.fireHook('filter:image.size', { path: path, }, function (err, image) { - callback(err, image); + callback(err, image ? { width: image.width, height: image.height } : undefined); }); } else { - new Jimp(path, function (err, data) { - callback(err, data ? data.bitmap : null); + sharp(path, { failOnError: true }).metadata(function (err, metadata) { + callback(err, metadata ? { width: metadata.width, height: metadata.height } : undefined); }); } }; +image.checkDimensions = function (path, callback) { + const meta = require('./meta'); + image.size(path, function (err, result) { + if (err) { + return callback(err); + } + + const maxWidth = parseInt(meta.config.rejectImageWidth, 10) || 5000; + const maxHeight = parseInt(meta.config.rejectImageHeight, 10) || 5000; + if (result.width > maxWidth || result.height > maxHeight) { + return callback(new Error('[[error:invalid-image-dimensions]]')); + } + + callback(); + }); +}; + image.convertImageToBase64 = function (path, callback) { fs.readFile(path, 'base64', callback); }; diff --git a/src/topics/thumb.js b/src/topics/thumb.js index cfd13f3fb8..17d2806810 100644 --- a/src/topics/thumb.js +++ b/src/topics/thumb.js @@ -49,7 +49,6 @@ module.exports = function (Topics) { var size = parseInt(meta.config.topicThumbSize, 10) || 120; image.resizeImage({ path: pathToUpload, - extension: path.extname(pathToUpload), width: size, height: size, }, next); diff --git a/src/upgrades/1.6.0/generate-email-logo.js b/src/upgrades/1.6.0/generate-email-logo.js index 6115e773a1..5832fb9739 100644 --- a/src/upgrades/1.6.0/generate-email-logo.js +++ b/src/upgrades/1.6.0/generate-email-logo.js @@ -34,7 +34,6 @@ module.exports = { image.resizeImage({ path: sourcePath, target: uploadPath, - extension: 'png', height: 50, }, next); }); diff --git a/src/user/picture.js b/src/user/picture.js index d1a4dac7b0..05ce284238 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -123,11 +123,9 @@ module.exports = function (User) { }, function (path, next) { picture.path = path; - var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 200; image.resizeImage({ path: picture.path, - extension: extension, width: imageDimension, height: imageDimension, }, next); diff --git a/src/views/admin/settings/uploads.tpl b/src/views/admin/settings/uploads.tpl index 34d7f96771..d008b0d9d3 100644 --- a/src/views/admin/settings/uploads.tpl +++ b/src/views/admin/settings/uploads.tpl @@ -21,7 +21,7 @@
- +

[[admin/settings/uploads:private-uploads-extensions-help]] @@ -52,6 +52,22 @@

+
+ + +

+ [[admin/settings/uploads:reject-image-width-help]] +

+
+ +
+ + +

+ [[admin/settings/uploads:reject-image-height-help]] +

+
+
-
+ +
+ +
+ \ No newline at end of file From 24601694db455b6e578c70972ba495170f8e4f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 21 Sep 2018 23:13:44 -0400 Subject: [PATCH 196/310] fix wrong year on upgrade script --- src/upgrades/1.8.1/diffs_zset_to_listhash.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrades/1.8.1/diffs_zset_to_listhash.js b/src/upgrades/1.8.1/diffs_zset_to_listhash.js index b7a2bba296..d5e065c698 100644 --- a/src/upgrades/1.8.1/diffs_zset_to_listhash.js +++ b/src/upgrades/1.8.1/diffs_zset_to_listhash.js @@ -7,7 +7,7 @@ var async = require('async'); module.exports = { name: 'Reformatting post diffs to be stored in lists and hash instead of single zset', - timestamp: Date.UTC(2017, 2, 15), + timestamp: Date.UTC(2018, 2, 15), method: function (callback) { var progress = this.progress; From 7787c9b4bbbdc40c636bd24fbeb5a8cf1a65e3c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 21 Sep 2018 23:14:55 -0400 Subject: [PATCH 197/310] fix wrong year on upgrade script --- src/upgrades/1.7.6/update_min_pass_strength.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrades/1.7.6/update_min_pass_strength.js b/src/upgrades/1.7.6/update_min_pass_strength.js index c051d1d72e..e12ed5d067 100644 --- a/src/upgrades/1.7.6/update_min_pass_strength.js +++ b/src/upgrades/1.7.6/update_min_pass_strength.js @@ -6,7 +6,7 @@ var async = require('async'); module.exports = { name: 'Revising minimum password strength to 1 (from 0)', - timestamp: Date.UTC(2017, 1, 21), + timestamp: Date.UTC(2018, 1, 21), method: function (callback) { async.waterfall([ async.apply(db.getObjectField.bind(db), 'config', 'minimumPasswordStrength'), From 17ce482c9f2a91af0ce75f4238c8e45642d51953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 22 Sep 2018 01:28:13 -0400 Subject: [PATCH 198/310] closes #6780 --- src/topics/unread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/unread.js b/src/topics/unread.js index cb197fac21..4990fc1fe7 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -66,7 +66,7 @@ module.exports = function (Topics) { Topics.getUnreadTids = function (params, callback) { var uid = parseInt(params.uid, 10); - if (uid === 0) { + if (uid <= 0) { return callback(null, []); } From 1bc87f3ae33c4bcddbe4faeeb542278143647610 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 22 Sep 2018 09:26:16 +0000 Subject: [PATCH 199/310] Latest translations and fallbacks --- public/language/pl/pages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index fdbbc69853..ff638a2506 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -54,7 +54,7 @@ "account/best": "Najlepsze posty napisane przez %1", "account/blocks": "Użytkownicy zablokowani przez %1", "account/uploads": "Pliki przesłane przez %1", - "account/sessions": "Login Sessions", + "account/sessions": "Sesje logowania", "confirm": "E-mail potwierdzony", "maintenance.text": "Obecnie trwają prace konserwacyjne nad %1. Wróć później.", "maintenance.messageIntro": "Dodatkowo administrator zostawił wiadomość:", From 1eafd84c7939559fdde55feca66fb2cfd202f797 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 22 Sep 2018 08:27:20 -0400 Subject: [PATCH 200/310] gdpr translations, it --- public/language/it/register.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/language/it/register.json b/public/language/it/register.json index 4e21839105..3f813280f9 100644 --- a/public/language/it/register.json +++ b/public/language/it/register.json @@ -20,7 +20,7 @@ "registration-added-to-queue": "La tua registrazione è stata aggiunta alla coda di moderazione. Riceverai una mail quando verrà accettata da un amministratore.", "interstitial.intro": "Abbiamo bisogno di qualche informazione in più prima di poter creare il tuo account.", "interstitial.errors-found": "Non abbiamo potuto completare la tua registrazione:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "Autorizzo la raccolta e il trattamento dei miei dati personali.", + "gdpr_agree_email": "Autorizzo l'invio del Sommario e di email di notifica.", + "gdpr_consent_denied": "E' necessario prestare il consenso al trattamento dei dati e l'autorizzazione all'invio di email." } \ No newline at end of file From d4cd74b7e212e957f614a265501f68523d37736a Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 23 Sep 2018 09:26:12 +0000 Subject: [PATCH 201/310] Latest translations and fallbacks --- public/language/it/user.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/language/it/user.json b/public/language/it/user.json index ff9efdf375..1148b2070b 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -151,9 +151,9 @@ "info.moderation-note.success": "Nota di moderazione salvata", "info.moderation-note.add": "Aggiungi nota", "consent.title": "Your Rights & Consent", - "consent.lead": "This community forum collects and processes your personal information.", - "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", - "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", + "consent.lead": "Questo forum raccoglie ed elabora i tuoi dati personali.", + "consent.intro": "Utilizziamo i tuoi dati al solo scopo di personalizzare la tua esperienza in questa Community e di associare al tuo account i post che scrivi.

Le informazioni che fornisci verranno conservate fino a quando non deciderai di rimuoverle, chiedendo la cancellazione del tuo profilo.

Per qualsiasi dubbio, contatta gli Amministratori del forum. ", + "consent.email_intro": "Occasionalmente, potremmo scriverti via email per fornirti aggiornamenti o informarti sulle novità della Community. Dalle impostazioni del tuo profilo puoi decidere che tipo di notifiche desideri ricevere via mail.", "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", "consent.digest_off": "Unless explicitly changed in your user settings, this community does not send out email digests", "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", From 08c45c3743a0cd74af1f2c78bd8ab4fd4a6dde95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Sep 2018 14:42:55 +0000 Subject: [PATCH 202/310] Update dependency nodebb-plugin-markdown to v8.8.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 8e19ce29da..2460f262c9 100644 --- a/install/package.json +++ b/install/package.json @@ -70,7 +70,7 @@ "nodebb-plugin-dbsearch": "2.0.21", "nodebb-plugin-emoji": "^2.2.5", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.7.3", + "nodebb-plugin-markdown": "8.8.0", "nodebb-plugin-mentions": "2.2.8", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.4", From df4f5f6f27005b3bd4107042fa5f6c4c6df1f18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 12:41:04 -0400 Subject: [PATCH 203/310] closes #6784 --- public/src/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/app.js b/public/src/app.js index d6b9833d53..be95518b8f 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -226,7 +226,7 @@ app.cacheBuster = null; }; function highlightNavigationLink() { - var path = window.location.pathname; + var path = window.location.pathname + window.location.search; $('#main-nav li').removeClass('active'); if (path) { $('#main-nav li').removeClass('active').find('a[href="' + path + '"]').parent().addClass('active'); From cf75c7961124a8cd3f80bbcb88f5c6f945376cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 12:58:59 -0400 Subject: [PATCH 204/310] Unread changes closes #6781 (#6783) * WIP * more unread work * faster teaser block handling if user doesn't have anyone blocked don't check * much faster filtering of blocked posts * add missing uid * add tidsByFilter to return * dont load all pids to find previous non-blocked teaser * fix unread filters they no longer use unread/new unread/watched etc they are query strings now * shorter nav item code * add unreplied to filters fix icons not clearing to 0 dont increment unread counters if there is a reply in a topic where you ignored the topic creator --- public/src/client/footer.js | 19 ++- src/middleware/header.js | 41 ++--- src/socket.io/helpers.js | 3 + src/socket.io/user.js | 15 +- src/topics/create.js | 2 +- src/topics/teaser.js | 84 +++++----- src/topics/unread.js | 314 +++++++++++++++++++++++------------- 7 files changed, 287 insertions(+), 191 deletions(-) diff --git a/public/src/client/footer.js b/public/src/client/footer.js index 53b9d334c0..b8db84fe09 100644 --- a/public/src/client/footer.js +++ b/public/src/client/footer.js @@ -44,16 +44,22 @@ define('forum/footer', ['notifications', 'chat', 'components', 'translator'], fu var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10); if (isNewTopic) { - var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread/new"].navigation-link i').attr('data-content'), 10) + 1; - updateUnreadTopicCount('/unread/new', unreadNewTopicCount); + var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=new"].navigation-link i').attr('data-content'), 10) + 1; + updateUnreadTopicCount('/unread?filter=new', unreadNewTopicCount); + } + + var isUnreplied = parseInt(post.topic.postcount, 10) <= 1; + if (isUnreplied) { + var unreadUnrepliedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=unreplied"].navigation-link i').attr('data-content'), 10) + 1; + updateUnreadTopicCount('/unread?filter=unreplied', unreadUnrepliedTopicCount); } socket.emit('topics.isFollowed', post.topic.tid, function (err, isFollowed) { if (err) { return app.alertError(err.message); } if (isFollowed) { - var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread/watched"].navigation-link i').attr('data-content'), 10) + 1; - updateUnreadTopicCount('/unread/watched', unreadWatchedTopicCount); + var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').attr('data-content'), 10) + 1; + updateUnreadTopicCount('/unread?filter=watched', unreadWatchedTopicCount); } }); } @@ -77,8 +83,9 @@ define('forum/footer', ['notifications', 'chat', 'components', 'translator'], fu function updateUnreadCounters(data) { updateUnreadTopicCount('/unread', data.unreadTopicCount); - updateUnreadTopicCount('/unread/new', data.unreadNewTopicCount); - updateUnreadTopicCount('/unread/watched', data.unreadWatchedTopicCount); + updateUnreadTopicCount('/unread?filter=new', data.unreadNewTopicCount); + updateUnreadTopicCount('/unread?filter=watched', data.unreadWatchedTopicCount); + updateUnreadTopicCount('/unread?filter=unreplied', data.unreadUnrepliedTopicCount); } socket.on('event:unread.updateCount', updateUnreadCounters); diff --git a/src/middleware/header.js b/src/middleware/header.js index f845d8b4bb..ed06c88ca5 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -120,9 +120,7 @@ module.exports = function (middleware) { banned: async.apply(user.isBanned, req.uid), banReason: async.apply(user.getBannedReason, req.uid), - unreadTopicCount: async.apply(topics.getTotalUnread, req.uid), - unreadNewTopicCount: async.apply(topics.getTotalUnread, req.uid, 'new'), - unreadWatchedTopicCount: async.apply(topics.getTotalUnread, req.uid, 'watched'), + unreadCounts: async.apply(topics.getUnreadTids, { uid: req.uid, count: true }), unreadChatCount: async.apply(messaging.getUnreadCount, req.uid), unreadNotificationCount: async.apply(user.notifications.getUnreadCount, req.uid), }, next); @@ -146,12 +144,14 @@ module.exports = function (middleware) { setBootswatchCSS(templateValues, res.locals.config); var unreadCount = { - topic: results.unreadTopicCount || 0, - newTopic: results.unreadNewTopicCount || 0, - watchedTopic: results.unreadWatchedTopicCount || 0, + topic: results.unreadCounts[''] || 0, + newTopic: results.unreadCounts.new || 0, + watchedTopic: results.unreadCounts.watched || 0, + unrepliedTopic: results.unreadCounts.unreplied || 0, chat: results.unreadChatCount || 0, notification: results.unreadNotificationCount || 0, }; + Object.keys(unreadCount).forEach(function (key) { if (unreadCount[key] > 99) { unreadCount[key] = '99+'; @@ -159,25 +159,18 @@ module.exports = function (middleware) { }); results.navigation = results.navigation.map(function (item) { - if (item.originalRoute === '/unread' && results.unreadTopicCount > 0) { - return Object.assign({}, item, { - content: unreadCount.topic, - iconClass: item.iconClass + ' unread-count', - }); + function modifyNavItem(item, route, count, content) { + if (item && item.originalRoute === route) { + item.content = content; + if (count > 0) { + item.iconClass += ' unread-count'; + } + } } - if (item.originalRoute === '/unread/new' && results.unreadNewTopicCount > 0) { - return Object.assign({}, item, { - content: unreadCount.newTopic, - iconClass: item.iconClass + ' unread-count', - }); - } - if (item.originalRoute === '/unread/watched' && results.unreadWatchedTopicCount > 0) { - return Object.assign({}, item, { - content: unreadCount.watchedTopic, - iconClass: item.iconClass + ' unread-count', - }); - } - + modifyNavItem(item, '/unread', results.unreadCounts[''], unreadCount.topic); + modifyNavItem(item, '/unread?filter=new', results.unreadCounts.new, unreadCount.newTopic); + modifyNavItem(item, '/unread?filter=watched', results.unreadCounts.watched, unreadCount.watchedTopic); + modifyNavItem(item, '/unread?filter=unreplied', results.unreadCounts.unreplied, unreadCount.unrepliedTopic); return item; }); diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 907d0726c1..1688d88252 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -34,6 +34,9 @@ SocketHelpers.notifyNew = function (uid, type, result) { function (uids, next) { user.blocks.filterUids(uid, uids, next); }, + function (uids, next) { + user.blocks.filterUids(result.posts[0].topic.uid, uids, next); + }, function (uids, next) { plugins.fireHook('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type }, next); }, diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 81182bdd09..facb0fa0a2 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -261,12 +261,19 @@ SocketUser.getUnreadCounts = function (socket, data, callback) { return callback(null, {}); } async.parallel({ - unreadTopicCount: async.apply(topics.getTotalUnread, socket.uid), - unreadNewTopicCount: async.apply(topics.getTotalUnread, socket.uid, 'new'), - unreadWatchedTopicCount: async.apply(topics.getTotalUnread, socket.uid, 'watched'), + unreadCounts: async.apply(topics.getUnreadTids, { uid: socket.uid, count: true }), unreadChatCount: async.apply(messaging.getUnreadCount, socket.uid), unreadNotificationCount: async.apply(user.notifications.getUnreadCount, socket.uid), - }, callback); + }, function (err, results) { + if (err) { + return callback(err); + } + results.unreadTopicCount = results.unreadCounts['']; + results.unreadNewTopicCount = results.unreadCounts.new; + results.unreadWatchedTopicCount = results.unreadCounts.watched; + results.unreadUnrepliedTopicCount = results.unreadCounts.unreplied; + callback(null, results); + }); }; SocketUser.invite = function (socket, email, callback) { diff --git a/src/topics/create.js b/src/topics/create.js index fcd166dfde..4a0d1be942 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -298,7 +298,7 @@ module.exports = function (Topics) { posts.getUserInfoForPosts([postData.uid], uid, next); }, topicInfo: function (next) { - Topics.getTopicFields(tid, ['tid', 'title', 'slug', 'cid', 'postcount', 'mainPid'], next); + Topics.getTopicFields(tid, ['tid', 'uid', 'title', 'slug', 'cid', 'postcount', 'mainPid'], next); }, parents: function (next) { Topics.addParentPosts([postData], next); diff --git a/src/topics/teaser.js b/src/topics/teaser.js index da7a05b59a..2a636b0702 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -5,6 +5,7 @@ var async = require('async'); var _ = require('lodash'); var winston = require('winston'); +var db = require('../database'); var meta = require('../meta'); var user = require('../user'); var posts = require('../posts'); @@ -112,53 +113,54 @@ module.exports = function (Topics) { }; function handleBlocks(uid, teasers, callback) { - async.mapSeries(teasers, function (postData, nextPost) { - async.waterfall([ - function (next) { - user.blocks.is(postData.uid, uid, next); - }, - function (isBlocked, next) { - if (!isBlocked) { - return nextPost(null, postData); - } - getPreviousNonBlockedPost(postData, uid, next); - }, - ], nextPost); - }, callback); + user.blocks.list(uid, function (err, blockedUids) { + if (err || !blockedUids.length) { + return callback(err, teasers); + } + async.mapSeries(teasers, function (postData, nextPost) { + if (blockedUids.includes(parseInt(postData.uid, 10))) { + getPreviousNonBlockedPost(postData, blockedUids, nextPost); + } else { + setImmediate(nextPost, null, postData); + } + }, callback); + }); } - function getPreviousNonBlockedPost(postData, uid, callback) { + function getPreviousNonBlockedPost(postData, blockedUids, callback) { let isBlocked = false; let prevPost = postData; - Topics.getPids(postData.tid, function (err, pids) { - if (err) { - return callback(err); - } + const postsPerIteration = 5; + let start = 0; + let stop = start + postsPerIteration - 1; - async.doWhilst(function (next) { - async.waterfall([ - function (next) { - const index = pids.lastIndexOf(String(prevPost.pid)); - if (index <= 0) { - return callback(null, null); - } + async.doWhilst(function (next) { + async.waterfall([ + function (next) { + db.getSortedSetRevRange('tid:' + postData.tid + ':posts', start, stop, next); + }, + function (pids, next) { + if (!pids.length) { + return callback(null, null); + } - posts.getPostFields(pids[index - 1], ['pid', 'uid', 'timestamp', 'tid', 'content'], next); - }, - function (_prevPost, next) { - prevPost = _prevPost; - user.blocks.is(prevPost.uid, uid, next); - }, - function (_isBlocked, next) { - isBlocked = _isBlocked; - next(); - }, - ], next); - }, function () { - return isBlocked && prevPost && prevPost.pid; - }, function (err) { - callback(err, prevPost); - }); + posts.getPostsFields(pids, ['pid', 'uid', 'timestamp', 'tid', 'content'], next); + }, + function (prevPosts, next) { + isBlocked = prevPosts.every(function (post) { + const isPostBlocked = blockedUids.includes(parseInt(post.uid, 10)); + prevPost = !isPostBlocked ? post : prevPost; + return isPostBlocked; + }); + start += postsPerIteration; + stop = start + postsPerIteration - 1; + next(); + }, + ], next); + }, function () { + return isBlocked && prevPost && prevPost.pid; + }, function (err) { + callback(err, prevPost); }); } diff --git a/src/topics/unread.js b/src/topics/unread.js index 4990fc1fe7..83e2192533 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -20,8 +20,8 @@ module.exports = function (Topics) { callback = filter; filter = ''; } - Topics.getUnreadTids({ cid: 0, uid: uid, filter: filter }, function (err, tids) { - callback(err, Array.isArray(tids) ? tids.length : 0); + Topics.getUnreadTids({ cid: 0, uid: uid, count: true }, function (err, counts) { + callback(err, counts && counts[filter]); }); }; @@ -66,10 +66,18 @@ module.exports = function (Topics) { Topics.getUnreadTids = function (params, callback) { var uid = parseInt(params.uid, 10); + var counts = { + '': 0, + new: 0, + watched: 0, + unreplied: 0, + }; if (uid <= 0) { - return callback(null, []); + return callback(null, params.count ? counts : []); } + params.filter = params.filter || ''; + var cutoff = params.cutoff || Topics.unreadCutoff(); if (params.cid && !Array.isArray(params.cid)) { @@ -95,148 +103,209 @@ module.exports = function (Topics) { }, function (results, next) { if (results.recentTids && !results.recentTids.length && !results.tids_unread.length) { - return callback(null, []); + return callback(null, params.count ? counts : []); } - var userRead = {}; - results.userScores.forEach(function (userItem) { - userRead[userItem.value] = userItem.score; - }); - - results.recentTids = results.recentTids.concat(results.tids_unread); - results.recentTids.sort(function (a, b) { - return b.score - a.score; - }); - - var tids = results.recentTids.filter(function (recentTopic) { - if (results.ignoredTids.indexOf(recentTopic.value.toString()) !== -1) { - return false; - } - switch (params.filter) { - case 'new': - return !userRead[recentTopic.value]; - default: - return !userRead[recentTopic.value] || recentTopic.score > userRead[recentTopic.value]; - } - }).map(function (topic) { - return topic.value; - }); - - tids = _.uniq(tids); - - if (params.filter === 'watched') { - Topics.filterWatchedTids(tids, uid, next); - } else if (params.filter === 'unreplied') { - Topics.filterUnrepliedTids(tids, next); - } else { - next(null, tids); - } + filterTopics(params, results, next); }, - function (tids, next) { - tids = tids.slice(0, 200); - - filterTopics(uid, tids, params.cid, params.filter, next); - }, - function (tids, next) { + function (data, next) { plugins.fireHook('filter:topics.getUnreadTids', { uid: uid, - tids: tids, + tids: data.tids, + counts: data.counts, + tidsByFilter: data.tidsByFilter, cid: params.cid, filter: params.filter, }, next); }, function (results, next) { - next(null, results.tids); + next(null, params.count ? results.counts : results.tids); }, ], callback); }; - function filterTopics(uid, tids, cid, filter, callback) { + function filterTopics(params, results, callback) { + const counts = { + '': 0, + new: 0, + watched: 0, + unreplied: 0, + }; + + const tidsByFilter = { + '': [], + new: [], + watched: [], + unreplied: [], + }; + + var userRead = {}; + results.userScores.forEach(function (userItem) { + userRead[userItem.value] = userItem.score; + }); + + results.recentTids = results.recentTids.concat(results.tids_unread); + results.recentTids.sort(function (a, b) { + return b.score - a.score; + }); + + var tids = results.recentTids.filter(function (recentTopic) { + if (results.ignoredTids.includes(String(recentTopic.value))) { + return false; + } + return !userRead[recentTopic.value] || recentTopic.score > userRead[recentTopic.value]; + }); + + tids = _.uniq(tids.map(topic => topic.value)); + + var cid = params.cid; + var uid = params.uid; + var cids; + var topicData; + var blockedUids; + + tids = tids.slice(0, 200); + if (!tids.length) { - return callback(null, tids); + return callback(null, { counts: counts, tids: tids }); } async.waterfall([ function (next) { - privileges.topics.filterTids('read', tids, uid, next); + user.blocks.list(uid, next); }, - function (tids, next) { + function (_blockedUids, next) { + blockedUids = _blockedUids; + filterTidsThatHaveBlockedPosts({ + uid: uid, + tids: tids, + blockedUids: blockedUids, + recentTids: results.recentTids, + }, next); + }, + function (_tids, next) { + tids = _tids; + Topics.getTopicsFields(tids, ['tid', 'cid', 'uid', 'postcount'], next); + }, + function (_topicData, next) { + topicData = _topicData; + cids = _.uniq(topicData.map(topic => topic.cid)).filter(Boolean); + async.parallel({ - topics: function (next) { - Topics.getTopicsFields(tids, ['tid', 'cid'], next); - }, isTopicsFollowed: function (next) { - if (filter === 'watched' || filter === 'new') { - return next(null, []); - } db.sortedSetScores('uid:' + uid + ':followed_tids', tids, next); }, ignoredCids: function (next) { - if (filter === 'watched') { - return next(null, []); - } user.getIgnoredCategories(uid, next); }, + readableCids: function (next) { + privileges.categories.filterCids('read', cids, uid, next); + }, }, next); }, function (results, next) { - var topics = results.topics; - cid = cid && cid.map(String); - topics = topics.filter(function (topic, index) { - return topic && topic.cid && - (!!results.isTopicsFollowed[index] || results.ignoredCids.indexOf(topic.cid.toString()) === -1) && - (!cid || (cid.length && cid.indexOf(String(topic.cid)) !== -1)); + + topicData.forEach(function (topic, index) { + function cidMatch(topicCid) { + return (!cid || (cid.length && cid.includes(String(topicCid)))); + } + + if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) { + if ((results.isTopicsFollowed[index] || !results.ignoredCids.includes(String(topic.cid)))) { + counts[''] += 1; + tidsByFilter[''].push(topic.tid); + } + + if (results.isTopicsFollowed[index]) { + counts.watched += 1; + tidsByFilter.watched.push(topic.tid); + } + + if (parseInt(topic.postcount, 10) <= 1) { + counts.unreplied += 1; + tidsByFilter.unreplied.push(topic.tid); + } + + if (!userRead[topic.tid]) { + counts.new += 1; + tidsByFilter.new.push(topic.tid); + } + } }); - user.blocks.filter(uid, topics, next); - }, - function (filteredTopics, next) { - tids = filteredTopics.map(function (topic) { - return topic && topic.tid; + next(null, { + counts: counts, + tids: tidsByFilter[params.filter], + tidsByFilter: tidsByFilter, }); - filterTidsThatHaveBlockedPosts(uid, tids, next); }, ], callback); } - function filterTidsThatHaveBlockedPosts(uid, tids, callback) { - async.filter(tids, function (tid, next) { - doesTidHaveUnblockedUnreadPosts(uid, tid, next); - }, callback); + function filterTidsThatHaveBlockedPosts(params, callback) { + if (!params.blockedUids.length) { + return setImmediate(callback, null, params.tids); + } + params.topicScores = {}; + params.recentTids.forEach(function (topic) { + params.topicScores[topic.value] = topic.score; + }); + + db.sortedSetScores('uid:' + params.uid + ':tids_read', params.tids, function (err, userScores) { + if (err) { + return callback(err); + } + params.userScores = {}; + userScores.forEach(function (score, index) { + params.userScores[params.tids[index]] = score; + }); + async.filter(params.tids, function (tid, next) { + doesTidHaveUnblockedUnreadPosts(tid, params, next); + }, callback); + }); } - function doesTidHaveUnblockedUnreadPosts(uid, tid, callback) { - var topicTimestamp; - var userLastReadTimestamp; - async.waterfall([ - function (next) { - async.parallel({ - topicTimestamp: async.apply(db.sortedSetScore, 'topics:recent', tid), - userLastReadTimestamp: async.apply(db.sortedSetScore, 'uid:' + uid + ':tids_read', tid), - }, next); - }, - function (results, next) { - topicTimestamp = results.topicTimestamp; - userLastReadTimestamp = results.userLastReadTimestamp; - if (!userLastReadTimestamp) { - return callback(null, true); - } - db.getSortedSetRevRangeByScore('tid:' + tid + ':posts', 0, -1, '+inf', userLastReadTimestamp, next); - }, - function (pidsSinceLastVisit, next) { - if (!pidsSinceLastVisit.length) { - return callback(null, topicTimestamp > userLastReadTimestamp); - } - posts.getPostsFields(pidsSinceLastVisit, ['pid', 'uid'], next); - }, - function (postData, next) { - user.blocks.filter(uid, postData, next); - }, - function (unreadPosts, next) { - next(null, unreadPosts.length > 0); - }, - ], callback); + function doesTidHaveUnblockedUnreadPosts(tid, params, callback) { + var topicTimestamp = params.topicScores[tid]; + var userLastReadTimestamp = params.userScores[tid]; + if (!userLastReadTimestamp) { + return setImmediate(callback, null, true); + } + var start = 0; + var count = 5; + var done = false; + var hasUnblockedUnread = topicTimestamp > userLastReadTimestamp; + + async.whilst(function () { + return !done; + }, function (_next) { + async.waterfall([ + function (next) { + db.getSortedSetRangeByScore('tid:' + tid + ':posts', start, count, userLastReadTimestamp, '+inf', next); + }, + function (pidsSinceLastVisit, next) { + if (!pidsSinceLastVisit.length) { + done = true; + return _next(); + } + + posts.getPostsFields(pidsSinceLastVisit, ['pid', 'uid'], next); + }, + function (postData, next) { + postData = postData.filter(function (post) { + return !params.blockedUids.includes(parseInt(post.uid, 10)); + }); + + done = postData.length > 0; + hasUnblockedUnread = postData.length > 0; + start += count; + next(); + }, + ], _next); + }, function (err) { + callback(err, hasUnblockedUnread); + }); } Topics.pushUnreadCount = function (uid, callback) { @@ -248,14 +317,15 @@ module.exports = function (Topics) { async.waterfall([ function (next) { - async.parallel({ - unreadTopicCount: async.apply(Topics.getTotalUnread, uid), - unreadNewTopicCount: async.apply(Topics.getTotalUnread, uid, 'new'), - unreadWatchedTopicCount: async.apply(Topics.getTotalUnread, uid, 'watched'), - }, next); + Topics.getUnreadTids({ uid: uid, count: true }, next); }, function (results, next) { - require('../socket.io').in('uid_' + uid).emit('event:unread.updateCount', results); + require('../socket.io').in('uid_' + uid).emit('event:unread.updateCount', { + unreadTopicCount: results[''], + unreadNewTopicCount: results.new, + unreadWatchedTopicCount: results.watched, + unreadUnrepliedTopicCount: results.unreplied, + }); setImmediate(next); }, ], callback); @@ -378,7 +448,7 @@ module.exports = function (Topics) { async.waterfall([ function (next) { async.parallel({ - recentScores: function (next) { + topicScores: function (next) { db.sortedSetScores('topics:recent', tids, next); }, userScores: function (next) { @@ -387,22 +457,36 @@ module.exports = function (Topics) { tids_unread: function (next) { db.sortedSetScores('uid:' + uid + ':tids_unread', tids, next); }, + blockedUids: function (next) { + user.blocks.list(uid, next); + }, }, next); }, function (results, next) { var cutoff = Topics.unreadCutoff(); var result = tids.map(function (tid, index) { var read = !results.tids_unread[index] && - (results.recentScores[index] < cutoff || - !!(results.userScores[index] && results.userScores[index] >= results.recentScores[index])); + (results.topicScores[index] < cutoff || + !!(results.userScores[index] && results.userScores[index] >= results.topicScores[index])); return { tid: tid, read: read }; }); + var topicScores = {}; + var userScores = {}; + tids.forEach(function (tid, index) { + topicScores[tid] = results.topicScores[index]; + userScores[tid] = results.userScores[index]; + }); + async.map(result, function (data, next) { if (data.read) { return next(null, true); } - doesTidHaveUnblockedUnreadPosts(uid, data.tid, function (err, hasUnblockedUnread) { + doesTidHaveUnblockedUnreadPosts(data.tid, { + topicScores: topicScores, + userScores: userScores, + blockedUids: results.blockedUids, + }, function (err, hasUnblockedUnread) { if (err) { return next(err); } From 5a69f979a834a126c197c28375ff31ccd65a1d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 16:57:19 -0400 Subject: [PATCH 205/310] update processSortedSet to use withScores --- src/database/postgres/sorted.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/database/postgres/sorted.js b/src/database/postgres/sorted.js index 7f136ac653..5ba554a57e 100644 --- a/src/database/postgres/sorted.js +++ b/src/database/postgres/sorted.js @@ -697,7 +697,7 @@ DELETE FROM "legacy_zset" z var batchSize = (options || {}).batch || 100; var query = client.query(new Cursor(` -SELECT z."value" v +SELECT z."value", z."score" v FROM "legacy_object_live" o INNER JOIN "legacy_zset" z ON o."_key" = z."_key" @@ -716,7 +716,7 @@ SELECT z."value" v } rows = rows.map(function (row) { - return row.v; + return options.withScores ? row : row.v; }); process(rows, function (err) { From 786311fa64ea2eeaff72410dd8fa5134061b5a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 16:58:35 -0400 Subject: [PATCH 206/310] use value --- src/database/postgres/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/postgres/sorted.js b/src/database/postgres/sorted.js index 5ba554a57e..8470109660 100644 --- a/src/database/postgres/sorted.js +++ b/src/database/postgres/sorted.js @@ -716,7 +716,7 @@ SELECT z."value", z."score" v } rows = rows.map(function (row) { - return options.withScores ? row : row.v; + return options.withScores ? row : row.value; }); process(rows, function (err) { From 9724ef083e7d71c618f5c8b253d8f0973229f641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 16:59:12 -0400 Subject: [PATCH 207/310] remove v from query --- src/database/postgres/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/postgres/sorted.js b/src/database/postgres/sorted.js index 8470109660..d540f6ca9a 100644 --- a/src/database/postgres/sorted.js +++ b/src/database/postgres/sorted.js @@ -697,7 +697,7 @@ DELETE FROM "legacy_zset" z var batchSize = (options || {}).batch || 100; var query = client.query(new Cursor(` -SELECT z."value", z."score" v +SELECT z."value", z."score" FROM "legacy_object_live" o INNER JOIN "legacy_zset" z ON o."_key" = z."_key" From 3ed856f587c2136d80f16ae811fcbe3b35923410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 17:42:54 -0400 Subject: [PATCH 208/310] change if --- src/user/bans.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/bans.js b/src/user/bans.js index e2cf2193b3..3307232d6e 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -30,7 +30,7 @@ module.exports = function (User) { async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', now, until), ]; - if (until > 0 && now < until) { + if (until > now) { tasks.push(async.apply(db.sortedSetAdd, 'users:banned:expire', until, uid)); tasks.push(async.apply(User.setUserField, uid, 'banned:expire', until)); } else { From 630873a74229cba8cf5f7b471150635f174f2a55 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Sep 2018 23:29:57 +0000 Subject: [PATCH 209/310] Update dependency nodebb-theme-persona to v9.0.33 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 2460f262c9..3591c949e6 100644 --- a/install/package.json +++ b/install/package.json @@ -76,7 +76,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.32", + "nodebb-theme-persona": "9.0.33", "nodebb-theme-slick": "1.2.10", "nodebb-theme-vanilla": "10.1.4", "nodebb-widget-essentials": "4.0.7", From 95501e8fee74008ea0cb9ed06da440365bc41830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 24 Sep 2018 20:20:52 -0400 Subject: [PATCH 210/310] closes #6738 closes #6290 (#6785) * closes #6738 closes #6290 * fix test, delete keys * delete all bans on user delete * fix upgrade script to actually read reason --- src/socket.io/user/ban.js | 8 +- src/upgrades/1.10.2/upgrade_bans_to_hashes.js | 83 +++++++++++++++++++ src/user/bans.js | 30 +++++-- src/user/delete.js | 18 ++++ src/user/info.js | 74 ++++++++--------- test/controllers-admin.js | 1 - 6 files changed, 165 insertions(+), 49 deletions(-) create mode 100644 src/upgrades/1.10.2/upgrade_bans_to_hashes.js diff --git a/src/socket.io/user/ban.js b/src/socket.io/user/ban.js index 5195f23d36..b53398791f 100644 --- a/src/socket.io/user/ban.js +++ b/src/socket.io/user/ban.js @@ -3,6 +3,7 @@ var async = require('async'); var winston = require('winston'); +var db = require('../../database'); var user = require('../../user'); var meta = require('../../meta'); var websockets = require('../index'); @@ -22,7 +23,7 @@ module.exports = function (SocketUser) { toggleBan(socket.uid, data.uids, function (uid, next) { async.waterfall([ function (next) { - banUser(uid, data.until || 0, data.reason || '', next); + banUser(socket.uid, uid, data.until || 0, data.reason || '', next); }, function (next) { events.log({ @@ -94,7 +95,7 @@ module.exports = function (SocketUser) { ], callback); } - function banUser(uid, until, reason, callback) { + function banUser(callerUid, uid, until, reason, callback) { async.waterfall([ function (next) { user.isAdministrator(uid, next); @@ -125,6 +126,9 @@ module.exports = function (SocketUser) { function (next) { user.ban(uid, until, reason, next); }, + function (banData, next) { + db.setObjectField('uid:' + uid + ':ban:' + banData.timestamp, 'fromUid', callerUid, next); + }, function (next) { if (!reason) { return translator.translate('[[user:info.banned-no-reason]]', function (translated) { diff --git a/src/upgrades/1.10.2/upgrade_bans_to_hashes.js b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js new file mode 100644 index 0000000000..bce9b7ce43 --- /dev/null +++ b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js @@ -0,0 +1,83 @@ +'use strict'; + +var db = require('../../database'); + +var async = require('async'); +var batch = require('../../batch'); +// var user = require('../../user'); + +module.exports = { + name: 'Upgrade bans to hashes', + timestamp: Date.UTC(2018, 8, 24), + method: function (callback) { + const progress = this.progress; + + batch.processSortedSet('users:joindate', function (uids, next) { + async.eachSeries(uids, function (uid, next) { + progress.incr(); + + async.parallel({ + bans: function (next) { + db.getSortedSetRevRangeWithScores('uid:' + uid + ':bans', 0, -1, next); + }, + reasons: function (next) { + db.getSortedSetRevRangeWithScores('banned:' + uid + ':reasons', 0, -1, next); + }, + userData: function (next) { + db.getObjectFields('user:' + uid, ['banned', 'banned:expire', 'joindate', 'lastposttime', 'lastonline'], next); + }, + }, function (err, results) { + function addBan(key, data, callback) { + async.waterfall([ + function (next) { + db.setObject(key, data, next); + }, + function (next) { + db.sortedSetAdd('uid:' + uid + ':bans:timestamp', data.timestamp, key, next); + }, + ], callback); + } + if (err) { + return next(err); + } + // has no ban history and isn't banned, skip + if (!results.bans.length && !parseInt(results.userData.banned, 10)) { + return next(); + } + + // has no history, but is banned, create plain object with just uid and timestmap + if (!results.bans.length && parseInt(results.userData.banned, 10)) { + const banTimestamp = results.userData.lastonline || results.userData.lastposttime || results.userData.joindate || Date.now(); + const banKey = 'uid:' + uid + ':ban:' + banTimestamp; + addBan(banKey, { uid: uid, timestamp: banTimestamp }, next); + return; + } + + // process ban history + async.eachSeries(results.bans, function (ban, next) { + function findReason(score) { + return results.reasons.find(function (reasonData) { + return reasonData.score === score; + }); + } + const reasonData = findReason(ban.score); + const banKey = 'uid:' + uid + ':ban:' + ban.score; + var data = { + uid: uid, + timestamp: ban.score, + expire: parseInt(ban.value, 10), + }; + if (reasonData) { + data.reason = reasonData.value; + } + addBan(banKey, data, next); + }, function (err) { + next(err); + }); + }); + }, next); + }, { + progress: this.progress, + }, callback); + }, +}; diff --git a/src/user/bans.js b/src/user/bans.js index 3307232d6e..9868c10776 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -24,10 +24,20 @@ module.exports = function (User) { return callback(new Error('[[error:ban-expiry-missing]]')); } + const banKey = 'uid:' + uid + ':ban:' + now; + var banData = { + uid: uid, + timestamp: now, + expire: until > now ? until : 0, + }; + if (reason) { + banData.reason = reason; + } var tasks = [ async.apply(User.setUserField, uid, 'banned', 1), async.apply(db.sortedSetAdd, 'users:banned', now, uid), - async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', now, until), + async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans:timestamp', now, banKey), + async.apply(db.setObject, banKey, banData), ]; if (until > now) { @@ -37,12 +47,8 @@ module.exports = function (User) { until = 0; } - if (reason) { - tasks.push(async.apply(db.sortedSetAdd, 'banned:' + uid + ':reasons', now, reason)); - } - async.series(tasks, function (err) { - callback(err); + callback(err, banData); }); }; @@ -86,10 +92,16 @@ module.exports = function (User) { User.getBannedReason = function (uid, callback) { async.waterfall([ function (next) { - db.getSortedSetRevRange('banned:' + uid + ':reasons', 0, 0, next); + db.getSortedSetRevRange('uid:' + uid + ':bans:timestamp', 0, 0, next); }, - function (reasons, next) { - next(null, reasons.length ? reasons[0] : ''); + function (keys, next) { + if (!keys.length) { + return callback(null, ''); + } + db.getObject(keys[0], next); + }, + function (banObj, next) { + next(null, banObj && banObj.reason ? banObj.reason : ''); }, ], callback); }; diff --git a/src/user/delete.js b/src/user/delete.js index 6712569634..3085a5c404 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -119,6 +119,7 @@ module.exports = function (User) { 'users:postcount', 'users:reputation', 'users:banned', + 'users:banned:expire', 'users:online', 'users:notvalidated', 'digest:day:uids', @@ -149,6 +150,9 @@ module.exports = function (User) { function (next) { deleteUserIps(uid, next); }, + function (next) { + deleteBans(uid, next); + }, function (next) { deleteUserFromFollowers(uid, next); }, @@ -220,6 +224,20 @@ module.exports = function (User) { ], callback); } + function deleteBans(uid, callback) { + async.waterfall([ + function (next) { + db.getSortedSetRange('uid:' + uid + ':bans:timestamp', 0, -1, next); + }, + function (bans, next) { + db.deleteAll(bans, next); + }, + function (next) { + db.delete('uid:' + uid + ':bans:timestamp', next); + }, + ], callback); + } + function deleteUserFromFollowers(uid, callback) { async.parallel({ followers: async.apply(db.getSortedSetRange, 'followers:' + uid, 0, -1), diff --git a/src/user/info.js b/src/user/info.js index 5e91c6cf08..eceea88b0e 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -5,6 +5,7 @@ var _ = require('lodash'); var validator = require('validator'); var db = require('../database'); +var user = require('../user'); var posts = require('../posts'); var topics = require('../topics'); var utils = require('../../public/src/utils'); @@ -12,30 +13,25 @@ var utils = require('../../public/src/utils'); module.exports = function (User) { User.getLatestBanInfo = function (uid, callback) { // Simply retrieves the last record of the user's ban, even if they've been unbanned since then. - var timestamp; - var expiry; - var reason; - async.waterfall([ - async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 0), + function (next) { + db.getSortedSetRevRange('uid:' + uid + ':bans:timestamp', 0, 0, next); + }, function (record, next) { if (!record.length) { return next(new Error('no-ban-info')); } - - timestamp = record[0].score; - expiry = record[0].value; - - db.getSortedSetRangeByScore('banned:' + uid + ':reasons', 0, -1, timestamp, timestamp, next); + db.getObject(record[0], next); }, - function (_reason, next) { - reason = _reason && _reason.length ? _reason[0] : ''; + function (banInfo, next) { + var expiry = banInfo.expire; + next(null, { uid: uid, - timestamp: timestamp, + timestamp: banInfo.timestamp, expiry: parseInt(expiry, 10), expiry_readable: new Date(parseInt(expiry, 10)).toString(), - reason: validator.escape(String(reason)), + reason: validator.escape(String(banInfo.reason || '')), }); }, ], callback); @@ -46,8 +42,7 @@ module.exports = function (User) { function (next) { async.parallel({ flags: async.apply(db.getSortedSetRevRangeWithScores, 'flags:byTargetUid:' + uid, 0, 19), - bans: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 19), - reasons: async.apply(db.getSortedSetRevRangeWithScores, 'banned:' + uid + ':reasons', 0, 19), + bans: async.apply(db.getSortedSetRevRange, 'uid:' + uid + ':bans:timestamp', 0, 19), }, next); }, function (data, next) { @@ -76,8 +71,7 @@ module.exports = function (User) { }); }, function (data, next) { - formatBanData(data); - next(null, data); + formatBanData(data, next); }, ], callback); }; @@ -131,26 +125,32 @@ module.exports = function (User) { ], callback); } - function formatBanData(data) { - var reasons = data.reasons.reduce(function (memo, cur) { - memo[cur.score] = cur.value; - return memo; - }, {}); + function formatBanData(data, callback) { + var banData; + async.waterfall([ + function (next) { + console.log(data); + db.getObjects(data.bans, next); + }, + function (_banData, next) { + banData = _banData; + var uids = banData.map(banData => banData.fromUid); - data.bans = data.bans.map(function (banObj) { - banObj.until = parseInt(banObj.value, 10); - banObj.untilReadable = new Date(banObj.until).toString(); - banObj.timestamp = parseInt(banObj.score, 10); - banObj.timestampReadable = new Date(banObj.score).toString(); - banObj.timestampISO = new Date(banObj.score).toISOString(); - banObj.reason = validator.escape(String(reasons[banObj.score] || '')) || '[[user:info.banned-no-reason]]'; - - delete banObj.value; - delete banObj.score; - delete data.reasons; - - return banObj; - }); + user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture'], next); + }, + function (usersData, next) { + data.bans = banData.map(function (banObj, index) { + banObj.user = usersData[index]; + banObj.until = parseInt(banObj.expire, 10); + banObj.untilReadable = new Date(banObj.until).toString(); + banObj.timestampReadable = new Date(banObj.timestamp).toString(); + banObj.timestampISO = utils.toISOString(banObj.timestamp); + banObj.reason = validator.escape(String(banObj.reason || '')) || '[[user:info.banned-no-reason]]'; + return banObj; + }); + next(null, data); + }, + ], callback); } User.getModerationNotes = function (uid, start, stop, callback) { diff --git a/test/controllers-admin.js b/test/controllers-admin.js index f35dd437fa..b84d13c66c 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -153,7 +153,6 @@ describe('Admin Controllers', function () { assert(body.history); assert(Array.isArray(body.history.flags)); assert(Array.isArray(body.history.bans)); - assert(Array.isArray(body.history.reasons)); assert(Array.isArray(body.sessions)); done(); }); From a125b4b4971137b528af55b665f7493d6d1312f2 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 25 Sep 2018 09:26:26 +0000 Subject: [PATCH 211/310] Latest translations and fallbacks --- .../language/lv/admin/advanced/database.json | 12 ++--- .../language/lv/admin/manage/categories.json | 6 +-- public/language/lv/admin/manage/tags.json | 2 +- public/language/lv/admin/settings/user.json | 4 +- public/language/lv/pages.json | 54 +++++++++---------- public/language/lv/topic.json | 10 ++-- public/language/lv/unread.json | 2 +- public/language/lv/user.json | 22 ++++---- 8 files changed, 56 insertions(+), 56 deletions(-) diff --git a/public/language/lv/admin/advanced/database.json b/public/language/lv/admin/advanced/database.json index b5351b91e4..e144688437 100644 --- a/public/language/lv/admin/advanced/database.json +++ b/public/language/lv/admin/advanced/database.json @@ -18,13 +18,13 @@ "mongo.resident-memory": "Resident Memory", "mongo.virtual-memory": "Virtual Memory", "mongo.mapped-memory": "Mapped Memory", - "mongo.raw-info": "MongoDB Raw Info", + "mongo.raw-info": "MongoDB neapstrādāta info", "redis": "Redis", "redis.version": "Redis Version", "redis.connected-clients": "Connected Clients", "redis.connected-slaves": "Connected Slaves", - "redis.blocked-clients": "Blocked Clients", + "redis.blocked-clients": "Bloķētie klienti", "redis.used-memory": "Used Memory", "redis.memory-frag-ratio": "Memory Fragmentation Ratio", "redis.total-connections-recieved": "Total Connections Received", @@ -32,9 +32,9 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info", + "redis.raw-info": "Redis neapstrādāta info", - "postgres": "Postgres", - "postgres.version": "PostgreSQL Version", - "postgres.raw-info": "Postgres Raw Info" + "postgres": "PostgreSQL", + "postgres.version": "PostgreSQL versija", + "postgres.raw-info": "PostgreSQL neapstrādāta info" } diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 2950afb0d4..6198b5ffbf 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -47,9 +47,9 @@ "analytics.back": "Back to Categories List", "analytics.title": "Analytics for \"%1\" category", "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", - "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", - "analytics.topics-daily": "Figure 3 – Daily topics created in this category", - "analytics.posts-daily": "Figure 4 – Daily posts made in this category", + "analytics.pageviews-daily": "Attēls 2 – Kategorijas lapas skatījumi dienā", + "analytics.topics-daily": "Attēls 3 – Kategorijas jauni temati dienā", + "analytics.posts-daily": "Attēls 4 – Kategorijas publicētās ziņas dienā", "alert.created": "Created", "alert.create-success": "Category successfully created!", diff --git a/public/language/lv/admin/manage/tags.json b/public/language/lv/admin/manage/tags.json index 32f75053c5..3ab6749957 100644 --- a/public/language/lv/admin/manage/tags.json +++ b/public/language/lv/admin/manage/tags.json @@ -13,7 +13,7 @@ "name": "Tag Name", "alerts.editing-multiple": "Rediģē vairākas birkas", - "alerts.editing-x": "Editing \"%1\" tag", + "alerts.editing-x": "Rediģē \"%1\" birku", "alerts.confirm-delete": "Vai vēlies izdzēst šīs birkas?", "alerts.update-success": "Tag Updated!" } \ No newline at end of file diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json index 270acf877f..08ef4627ee 100644 --- a/public/language/lv/admin/settings/user.json +++ b/public/language/lv/admin/settings/user.json @@ -56,11 +56,11 @@ "topic-search": "Enable In-Topic Searching", "digest-freq": "Subscribe to Digest", "digest-freq.off": "Off", - "digest-freq.daily": "Daily", + "digest-freq.daily": "Dienā", "digest-freq.weekly": "Weekly", "digest-freq.monthly": "Monthly", "email-chat-notifs": "Sūtīt e-pastu, ja ierodas jauna saruna un es neesmu tiešsaistē", - "email-post-notif": "Send an email when replies are made to topics I am subscribed to", + "email-post-notif": "Sūtīt e-pastu, kad kāds atbild uz tēmatiem, kurus esmu abonējis", "follow-created-topics": "Sekot tēmatiem, kurus Tu izveido", "follow-replied-topics": "Sekot tēmatiem, uz kuriem Tu atbildi", "default-notification-settings": "Default notification settings" diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 559e188690..6883e532b6 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -23,40 +23,40 @@ "users/search": "Meklēt lietotājus", "notifications": "Paziņojumi", "tags": "Birkas", - "tag": "Topics tagged under "%1"", - "register": "Register an account", + "tag": "Temati, kas atzīmēti ar "%1"", + "register": "Reģistrēt kontu", "registration-complete": "Reģistrācija ir pabeigta", - "login": "Login to your account", - "reset": "Reset your account password", - "categories": "Categories", - "groups": "Groups", - "group": "%1 group", + "login": "Ielogoties savā kontā", + "reset": "Atiestatīt sava konta paroli", + "categories": "Kategorijas", + "groups": "Grupas", + "group": "Grupa %1", "chats": "Sarunas", "chat": "Sarunājās ar %1", "flags": "Atzīmes", "flag-details": "Atzīmes %1 informācija", - "account/edit": "Editing \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/info": "Account Info", + "account/edit": "Rediģē \"%1\"", + "account/edit/password": "Rediģē \"%1\" paroli", + "account/edit/username": "Rediģē \"%1\" lietotājvārdu", + "account/edit/email": "Rediģē \"%1\" e-pasta adresi", + "account/info": "Konta info", "account/following": "Tie, kuri %1 seko", "account/followers": "Tie, kuri seko %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", - "account/groups": "%1's Groups", - "account/bookmarks": "%1 ziņas atzīmētas ar grāmatzīmi", - "account/settings": "User Settings", - "account/watched": "Topics watched by %1", - "account/ignored": "Topics ignored by %1", + "account/posts": "%1 ziņas", + "account/topics": "%1 temati", + "account/groups": "%1 grupas", + "account/bookmarks": "%1 atzīmētas ziņas", + "account/settings": "Lietotāja iestatījumi", + "account/watched": "Temati, kurus %1 novēro", + "account/ignored": "Temati, kurus %1 nenovēro", "account/upvoted": "Ziņas, kurām %1 balsoja par", "account/downvoted": "Ziņas, kurām %1 balsoja pret", - "account/best": "Best posts made by %1", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", - "account/sessions": "Login Sessions", - "confirm": "Email Confirmed", - "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", - "maintenance.messageIntro": "Additionally, the administrator has left this message:", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "account/best": "%1 labākās ziņas", + "account/blocks": "%1 bloķētie lietotāji", + "account/uploads": "%1 augšupielādētie", + "account/sessions": "Tiešsaistes sesijas", + "confirm": "E-pasta adrese apstiprināta", + "maintenance.text": "%1 šobrīd notiek apkope. Lūdzu, atgriezies vēlāk.", + "maintenance.messageIntro": "Turklāt administrators ir atstājis šo ziņojumu:", + "throttled.text": "%1 šobrīd nav pieejams pārmērīgas slodzes dēļ. Lūdzu, atgriezies vēlāk." } \ No newline at end of file diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json index 83336adb02..e6f0dea675 100644 --- a/public/language/lv/topic.json +++ b/public/language/lv/topic.json @@ -44,13 +44,13 @@ "markAsUnreadForAll.success": "Temats visiem atzīmēts kā nelasīts", "mark_unread": "Atzīmēt kā nelasītu", "mark_unread.success": "Temats atzīmēts kā nelasīts", - "watch": "Watch", - "unwatch": "Unwatch", + "watch": "Novērot", + "unwatch": "Pārtraukt novērošanu", "watch.title": "Tiec informēts par jaunām atbildēm šajā tematā", - "unwatch.title": "Stop watching this topic", + "unwatch.title": "Pārtraukt temata novērošanu", "share_this_post": "Share this Post", - "watching": "Watching", - "not-watching": "Not Watching", + "watching": "Novēro", + "not-watching": "Nenovēro", "ignoring": "Ignoring", "watching.description": "Notify me of new replies.
Show topic in unread.", "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", diff --git a/public/language/lv/unread.json b/public/language/lv/unread.json index 29f4bc04e6..44db23fb9e 100644 --- a/public/language/lv/unread.json +++ b/public/language/lv/unread.json @@ -9,7 +9,7 @@ "topics_marked_as_read.success": "Temati atzīmēti kā lasīti!", "all-topics": "All Topics", "new-topics": "Jauni temati", - "watched-topics": "Watched Topics", + "watched-topics": "Novērotie temati", "unreplied-topics": "Unreplied Topics", "multiple-categories-selected": "Multiple Selected" } \ No newline at end of file diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 5a2fcfbcdd..94686b48d1 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -7,7 +7,7 @@ "postcount": "Post Count", "email": "Email", "confirm_email": "Confirm Email", - "account_info": "Account Info", + "account_info": "Konta info", "ban_account": "Bloķēt kontu", "ban_account_confirm": "Vai tiešām vēlies bloķēt šo lietotāju?", "unban_account": "Atbloķēt kontu", @@ -25,14 +25,14 @@ "profile_views": "Profile views", "reputation": "Ranga punkti", "bookmarks": "Bookmarks", - "watched": "Watched", + "watched": "Novērotie", "ignored": "Ignored", "followers": "Tie, kuri mani seko", "following": "Tie, kuri es sekoju", - "blocks": "Blocks", - "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "blocks": "Bloķētie", + "block_toggle": "Pārslēgt bloķēto", + "block_user": "Bloķēt lietotāju", + "unblock_user": "Atbloķēt lietotāju", "aboutme": "About me", "signature": "Signature", "birthday": "Birthday", @@ -80,7 +80,7 @@ "digest_label": "Subscribe to Digest", "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", "digest_off": "Off", - "digest_daily": "Daily", + "digest_daily": "Dienā", "digest_weekly": "Weekly", "digest_monthly": "Monthly", "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", @@ -88,12 +88,12 @@ "follows_no_one": "Šis lietotājs neseko nevienam :(", "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_watched_topics": "Lietotājs vēl nenovēro nevienu tematu.", "has_no_ignored_topics": "This user hasn't ignored any topics yet.", "has_no_upvoted_posts": "Šis lietotājs vēl nav balsojis par nevienu ziņu.", "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", "has_no_voted_posts": "This user has no voted posts", - "has_no_blocks": "You have blocked no users.", + "has_no_blocks": "Tu neesi bloķējis nevienu lietotāju.", "email_hidden": "E-pasta adrese paslēpta", "hidden": "paslēpts", "paginate_description": "Paginate topics and posts instead of using infinite scroll", @@ -121,8 +121,8 @@ "delay_image_loading": "Delay Image Loading", "image_load_delay_help": "If enabled, images in topics will not load until they are scrolled into view", "scroll_to_my_post": "After posting a reply, show the new post", - "follow_topics_you_reply_to": "Watch topics that you reply to", - "follow_topics_you_create": "Watch topics you create", + "follow_topics_you_reply_to": "Novēro tematus, kuriem esi atbildējis", + "follow_topics_you_create": "Novēro tematus, kurus esi izveidojis", "grouptitle": "Group Title", "no-group-title": "No group title", "select-skin": "Select a Skin", From f273746bbd707759e047d734eecd570fb14dc1a5 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 Sep 2018 23:30:01 +0000 Subject: [PATCH 212/310] Update dependency validator to v10.8.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3591c949e6..d02eb72c7f 100644 --- a/install/package.json +++ b/install/package.json @@ -110,7 +110,7 @@ "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", "util.promisify": "1.0.0", - "validator": "10.7.1", + "validator": "10.8.0", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "^4.1.1", From 15904526974b3d5a6e9a885649f708bf1953b87e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 Sep 2018 11:14:25 -0400 Subject: [PATCH 213/310] filter topics you cant read @benlubar --- src/topics/unread.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/topics/unread.js b/src/topics/unread.js index 83e2192533..275cfec69c 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -205,10 +205,11 @@ module.exports = function (Topics) { }, function (results, next) { cid = cid && cid.map(String); + results.readableCids = results.readableCids.map(String); topicData.forEach(function (topic, index) { function cidMatch(topicCid) { - return (!cid || (cid.length && cid.includes(String(topicCid)))); + return (!cid || (cid.length && cid.includes(String(topicCid)))) && results.readableCids.includes(String(topicCid)); } if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) { From 78b47b33af68b5c97e772da13a237f980aeabe9a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 25 Sep 2018 11:15:06 -0400 Subject: [PATCH 214/310] bump persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index d02eb72c7f..ab745bc286 100644 --- a/install/package.json +++ b/install/package.json @@ -76,7 +76,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.33", + "nodebb-theme-persona": "9.0.34", "nodebb-theme-slick": "1.2.10", "nodebb-theme-vanilla": "10.1.4", "nodebb-widget-essentials": "4.0.7", From f618ba8e1ed54cf5a07def868f3eab5d616b554e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 Sep 2018 12:07:56 -0400 Subject: [PATCH 215/310] add private category test for unread tids --- test/topics.js | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/test/topics.js b/test/topics.js index 5629fdf27a..c7655e6d66 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1063,7 +1063,6 @@ describe('Topic\'s', function () { }); }); - it('should fail with invalid data', function (done) { socketTopics.markAsRead({ uid: 0 }, null, function (err) { assert.equal(err.message, '[[error:invalid-data]]'); @@ -1071,7 +1070,6 @@ describe('Topic\'s', function () { }); }); - it('should mark topic read', function (done) { socketTopics.markAsRead({ uid: adminUid }, [tid], function (err) { assert.ifError(err); @@ -1156,7 +1154,6 @@ describe('Topic\'s', function () { }); }); - it('should fail with invalid data', function (done) { socketTopics.markAsUnreadForAll({ uid: adminUid }, null, function (err) { assert.equal(err.message, '[[error:invalid-tid]]'); @@ -1211,6 +1208,35 @@ describe('Topic\'s', function () { done(); }); }); + + it('should not return topics in category you cant read', function (done) { + var privateCid; + var privateTid; + async.waterfall([ + function (next) { + categories.create({ + name: 'private category', + description: 'private category', + }, next); + }, + function (category, next) { + privateCid = category.cid; + privileges.categories.rescind(['read'], category.cid, 'registered-users', next); + }, + function (next) { + topics.post({ uid: adminUid, title: 'topic in private category', content: 'registered-users cant see this', cid: privateCid }, next); + }, + function (data, next) { + privateTid = data.topicData.tid; + topics.getUnreadTids({ uid: uid }, next); + }, + function (unreadTids, next) { + unreadTids = unreadTids.map(String); + assert(!unreadTids.includes(String(privateTid))); + next(); + }, + ], done); + }); }); describe('tags', function () { From 11b655163ea839fc14b40608e0031d1e505681c7 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Tue, 25 Sep 2018 11:12:18 -0500 Subject: [PATCH 216/310] Only run the DDL for session storage on the primary instance. (#6788) This fixes a restart loop caused by deadlocks in large clusters. --- src/database/postgres.js | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/database/postgres.js b/src/database/postgres.js index df1ccf8784..f06c962c22 100644 --- a/src/database/postgres.js +++ b/src/database/postgres.js @@ -364,6 +364,21 @@ postgresModule.initSessionStore = function (callback) { return callback(); } + function done() { + sessionStore = require('connect-pg-simple')(session); + postgresModule.sessionStore = new sessionStore({ + pool: db, + ttl: ttl, + pruneSessionInterval: nconf.get('isPrimary') === 'true' ? 60 : false, + }); + + callback(); + } + + if (nconf.get('isPrimary') !== 'true') { + return done(); + } + db.query(` CREATE TABLE IF NOT EXISTS "session" ( "sid" CHAR(32) NOT NULL @@ -382,14 +397,7 @@ ALTER TABLE "session" return callback(err); } - sessionStore = require('connect-pg-simple')(session); - postgresModule.sessionStore = new sessionStore({ - pool: db, - ttl: ttl, - pruneSessionInterval: nconf.get('isPrimary') === 'true' ? 60 : false, - }); - - callback(); + done(); }); }; From 02046889ecd3ab92da89f4fc6ee056f18be87524 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 25 Sep 2018 12:44:10 -0400 Subject: [PATCH 217/310] closes #6691 --- install/package.json | 2 +- src/routes/authentication.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index ab745bc286..eca03915c2 100644 --- a/install/package.json +++ b/install/package.json @@ -76,7 +76,7 @@ "nodebb-plugin-spam-be-gone": "0.5.4", "nodebb-rewards-essentials": "0.0.11", "nodebb-theme-lavender": "5.0.7", - "nodebb-theme-persona": "9.0.34", + "nodebb-theme-persona": "9.0.35", "nodebb-theme-slick": "1.2.10", "nodebb-theme-vanilla": "10.1.4", "nodebb-widget-essentials": "4.0.7", diff --git a/src/routes/authentication.js b/src/routes/authentication.js index ccb3e316e0..8e743cc988 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -87,7 +87,8 @@ Auth.reloadRoutes = function (callback) { router.post('/register', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.register); router.post('/register/complete', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.registerComplete); - router.get('/register/abort', controllers.authentication.registerAbort); + // router.get('/register/abort', controllers.authentication.registerAbort); + router.post('/register/abort', controllers.authentication.registerAbort); router.post('/login', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.login); router.post('/logout', Auth.middleware.applyCSRF, controllers.authentication.logout); From b2f812befae32074473d3d53def12dfac2b3c876 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" Date: Tue, 25 Sep 2018 14:14:10 -0400 Subject: [PATCH 218/310] Update dependency mongodb to v3.1.6 (#6582) --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index eca03915c2..fa149e8593 100644 --- a/install/package.json +++ b/install/package.json @@ -61,7 +61,7 @@ "material-design-lite": "^1.3.0", "mime": "^2.2.0", "mkdirp": "^0.5.1", - "mongodb": "3.0.8", + "mongodb": "3.1.6", "morgan": "^1.9.0", "mousetrap": "^1.6.1", "mubsub-nbb": "^1.5.0", From c9dfb4e109b9a4ed5226f8a1d233840ccc44eae2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 25 Sep 2018 14:45:43 -0400 Subject: [PATCH 219/310] closes #6790 --- src/emailer.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/emailer.js b/src/emailer.js index 6b74158b22..dbc56b9175 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -210,6 +210,12 @@ Emailer.sendToEmail = function (template, email, language, params, callback) { var lang = language || meta.config.defaultLang || 'en-GB'; + // Add some default email headers based on local configuration + params.headers = Object.assign({ + 'List-Id': '<' + [template, params.uid, getHostname()].join('.') + '>', + 'List-Unsubscribe': '<' + [nconf.get('url'), 'uid', params.uid, 'settings'].join('/') + '>', + }, params.headers); + async.waterfall([ function (next) { Plugins.fireHook('filter:email.params', { @@ -249,6 +255,7 @@ Emailer.sendToEmail = function (template, email, language, params, callback) { uid: params.uid, pid: params.pid, fromUid: params.fromUid, + headers: params.headers, }; Plugins.fireHook('filter:email.modify', data, next); }, From 3554a0a725d495e797cd4e7578ea805b282bf277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 Sep 2018 17:53:51 -0400 Subject: [PATCH 220/310] closes #6791, if fileSize isn't passed in don't perform check --- public/src/modules/pictureCropper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index f732d7a208..0d8fe3a3ca 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -164,7 +164,7 @@ define('pictureCropper', ['translator', 'cropper', 'benchpress'], function (tran var imageUrl; var imageType = file.type; var fileSize = data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false; - if (file.size > fileSize * 1024) { + if (fileSize && file.size > fileSize * 1024) { return app.alertError('[[error:file-too-big, ' + fileSize + ']]'); } reader.addEventListener('load', function () { From 3c6ec68eae9ba638ff916b345e7be2561bfa7599 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 25 Sep 2018 22:34:34 +0000 Subject: [PATCH 221/310] Update dependency postcss to v7.0.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index fa149e8593..6ac849df78 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "passport-local": "1.0.0", "pg": "^7.4.0", "pg-cursor": "^1.3.0", - "postcss": "7.0.2", + "postcss": "7.0.3", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", From 1cb2e1e3688affd949cde9f514ae0d345c339538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 26 Sep 2018 10:56:19 -0400 Subject: [PATCH 222/310] remove console.log switch to series --- src/user/info.js | 1 - test/topics.js | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/user/info.js b/src/user/info.js index eceea88b0e..aabdac3534 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -129,7 +129,6 @@ module.exports = function (User) { var banData; async.waterfall([ function (next) { - console.log(data); db.getObjects(data.bans, next); }, function (_banData, next) { diff --git a/test/topics.js b/test/topics.js index c7655e6d66..cd15149d6e 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1244,14 +1244,14 @@ describe('Topic\'s', function () { var socketAdmin = require('../src/socket.io/admin'); before(function (done) { - async.parallel({ - topic1: function (next) { + async.series([ + function (next) { topics.post({ uid: adminUid, tags: ['php', 'nosql', 'psql', 'nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId }, next); }, - topic2: function (next) { + function (next) { topics.post({ uid: adminUid, tags: ['javascript', 'mysql', 'python', 'nodejs'], title: 'topic title 2', content: 'topic 2 content', cid: topic.categoryId }, next); }, - }, function (err) { + ], function (err) { assert.ifError(err); done(); }); From 18d0deeccb656937692934a48fa1be05ae7ab6f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 26 Sep 2018 15:02:57 -0400 Subject: [PATCH 223/310] update deprecated methods (#6794) --- src/database/mongo.js | 1 + src/database/mongo/hash.js | 14 ++-- src/database/mongo/list.js | 10 +-- src/database/mongo/main.js | 10 +-- src/database/mongo/sets.js | 14 ++-- src/database/mongo/sorted.js | 72 ++++++++++--------- src/database/mongo/sorted/add.js | 2 +- src/database/mongo/sorted/remove.js | 12 ++-- src/upgrades/1.7.3/key_value_schema_change.js | 4 +- test/database/keys.js | 18 +++++ 10 files changed, 90 insertions(+), 67 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 99e045d9f4..9ab35feba2 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -98,6 +98,7 @@ mongoModule.getConnectionOptions = function () { reconnectTries: 3600, reconnectInterval: 1000, autoReconnect: true, + useNewUrlParser: true, }; return _.merge(connOptions, nconf.get('mongo:options') || {}); diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index bfbeb5cb6c..1298e6e292 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -46,7 +46,7 @@ module.exports = function (db, module) { if (data.hasOwnProperty('')) { delete data['']; } - db.collection('objects').update({ _key: key }, { $set: data }, { upsert: true, w: 1 }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $set: data }, { upsert: true, w: 1 }, function (err) { if (err) { return callback(err); } @@ -208,8 +208,8 @@ module.exports = function (db, module) { } var data = {}; field = helpers.fieldToString(field); - data[field] = ''; - db.collection('objects').findOne({ _key: key }, { fields: data }, function (err, item) { + data[field] = 1; + db.collection('objects').findOne({ _key: key }, { projection: data }, function (err, item) { callback(err, !!item && item[field] !== undefined && item[field] !== null); }); }; @@ -222,10 +222,10 @@ module.exports = function (db, module) { var data = {}; fields.forEach(function (field) { field = helpers.fieldToString(field); - data[field] = ''; + data[field] = 1; }); - db.collection('objects').findOne({ _key: key }, { fields: data }, function (err, item) { + db.collection('objects').findOne({ _key: key }, { projection: data }, function (err, item) { if (err) { return callback(err); } @@ -259,7 +259,7 @@ module.exports = function (db, module) { data[field] = ''; }); - db.collection('objects').update({ _key: key }, { $unset: data }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $unset: data }, function (err) { if (err) { return callback(err); } @@ -317,7 +317,7 @@ module.exports = function (db, module) { } - db.collection('objects').findAndModify({ _key: key }, {}, { $inc: data }, { new: true, upsert: true }, function (err, result) { + db.collection('objects').findOneAndUpdate({ _key: key }, { $inc: data }, { returnOriginal: false, upsert: true }, function (err, result) { if (err) { return callback(err); } diff --git a/src/database/mongo/list.js b/src/database/mongo/list.js index b0b87ae922..219cd53be5 100644 --- a/src/database/mongo/list.js +++ b/src/database/mongo/list.js @@ -18,7 +18,7 @@ module.exports = function (db, module) { } if (exists) { - db.collection('objects').update({ _key: key }, { $push: { array: { $each: [value], $position: 0 } } }, { upsert: true, w: 1 }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $push: { array: { $each: [value], $position: 0 } } }, { upsert: true, w: 1 }, function (err) { callback(err); }); } else { @@ -33,7 +33,7 @@ module.exports = function (db, module) { return callback(); } value = helpers.valueToString(value); - db.collection('objects').update({ _key: key }, { $push: { array: value } }, { upsert: true, w: 1 }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $push: { array: value } }, { upsert: true, w: 1 }, function (err) { callback(err); }); }; @@ -48,7 +48,7 @@ module.exports = function (db, module) { return callback(err); } - db.collection('objects').update({ _key: key }, { $pop: { array: 1 } }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $pop: { array: 1 } }, function (err) { callback(err, (value && value.length) ? value[0] : null); }); }); @@ -61,7 +61,7 @@ module.exports = function (db, module) { } value = helpers.valueToString(value); - db.collection('objects').update({ _key: key }, { $pull: { array: value } }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $pull: { array: value } }, function (err) { callback(err); }); }; @@ -76,7 +76,7 @@ module.exports = function (db, module) { return callback(err); } - db.collection('objects').update({ _key: key }, { $set: { array: value } }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $set: { array: value } }, function (err) { callback(err); }); }); diff --git a/src/database/mongo/main.js b/src/database/mongo/main.js index 55a29e6ff9..1b23bc3409 100644 --- a/src/database/mongo/main.js +++ b/src/database/mongo/main.js @@ -12,7 +12,7 @@ module.exports = function (db, module) { module.emptydb = function (callback) { callback = callback || helpers.noop; - db.collection('objects').remove({}, function (err) { + db.collection('objects').deleteMany({}, function (err) { if (err) { return callback(err); } @@ -35,7 +35,7 @@ module.exports = function (db, module) { if (!key) { return callback(); } - db.collection('objects').remove({ _key: key }, function (err) { + db.collection('objects').deleteMany({ _key: key }, function (err) { if (err) { return callback(err); } @@ -49,7 +49,7 @@ module.exports = function (db, module) { if (!Array.isArray(keys) || !keys.length) { return callback(); } - db.collection('objects').remove({ _key: { $in: keys } }, function (err) { + db.collection('objects').deleteMany({ _key: { $in: keys } }, function (err) { if (err) { return callback(err); } @@ -97,14 +97,14 @@ module.exports = function (db, module) { if (!key) { return callback(); } - db.collection('objects').findAndModify({ _key: key }, {}, { $inc: { data: 1 } }, { new: true, upsert: true }, function (err, result) { + db.collection('objects').findOneAndUpdate({ _key: key }, { $inc: { data: 1 } }, { returnOriginal: false, upsert: true }, function (err, result) { callback(err, result && result.value ? result.value.data : null); }); }; module.rename = function (oldKey, newKey, callback) { callback = callback || helpers.noop; - db.collection('objects').update({ _key: oldKey }, { $set: { _key: newKey } }, { multi: true }, function (err) { + db.collection('objects').updateMany({ _key: oldKey }, { $set: { _key: newKey } }, function (err) { if (err) { return callback(err); } diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js index 4f807b3922..b66772639c 100644 --- a/src/database/mongo/sets.js +++ b/src/database/mongo/sets.js @@ -13,7 +13,7 @@ module.exports = function (db, module) { array[index] = helpers.valueToString(element); }); - db.collection('objects').update({ + db.collection('objects').updateOne({ _key: key, }, { $addToSet: { @@ -74,7 +74,7 @@ module.exports = function (db, module) { callback(err); }); } else { - db.collection('objects').update({ _key: key }, { $pullAll: { members: value } }, function (err) { + db.collection('objects').updateOne({ _key: key }, { $pullAll: { members: value } }, function (err) { callback(err); }); } @@ -87,7 +87,7 @@ module.exports = function (db, module) { } value = helpers.valueToString(value); - db.collection('objects').update({ _key: { $in: keys } }, { $pull: { members: value } }, { multi: true }, function (err) { + db.collection('objects').updateMany({ _key: { $in: keys } }, { $pull: { members: value } }, function (err) { callback(err); }); }; @@ -98,7 +98,7 @@ module.exports = function (db, module) { } value = helpers.valueToString(value); - db.collection('objects').findOne({ _key: key, members: value }, { _id: 0, members: 0 }, function (err, item) { + db.collection('objects').findOne({ _key: key, members: value }, { projection: { _id: 0, members: 0 } }, function (err, item) { callback(err, item !== null && item !== undefined); }); }; @@ -112,7 +112,7 @@ module.exports = function (db, module) { values[i] = helpers.valueToString(values[i]); } - db.collection('objects').findOne({ _key: key }, { _id: 0, _key: 0 }, function (err, items) { + db.collection('objects').findOne({ _key: key }, { projection: { _id: 0, _key: 0 } }, function (err, items) { if (err) { return callback(err); } @@ -131,7 +131,7 @@ module.exports = function (db, module) { } value = helpers.valueToString(value); - db.collection('objects').find({ _key: { $in: sets }, members: value }, { _id: 0, members: 0 }).toArray(function (err, result) { + db.collection('objects').find({ _key: { $in: sets }, members: value }, { projection: { _id: 0, members: 0 } }).toArray(function (err, result) { if (err) { return callback(err); } @@ -184,7 +184,7 @@ module.exports = function (db, module) { if (!key) { return callback(null, 0); } - db.collection('objects').findOne({ _key: key }, { _id: 0 }, function (err, data) { + db.collection('objects').findOne({ _key: key }, { projection: { _id: 0 } }, function (err, data) { callback(err, data ? data.members.length : 0); }); }; diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index d4eb7a8522..9ec82f5a68 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -32,9 +32,9 @@ module.exports = function (db, module) { return callback(); } - var fields = { _id: 0, value: 1 }; - if (withScores) { - fields.score = 1; + var fields = { _id: 0, _key: 0 }; + if (!withScores) { + fields.score = 0; } if (Array.isArray(key)) { @@ -62,7 +62,7 @@ module.exports = function (db, module) { limit = 0; } - db.collection('objects').find({ _key: key }, { fields: fields }) + db.collection('objects').find({ _key: key }, { projection: fields }) .limit(limit) .skip(start) .sort({ score: sort }) @@ -70,6 +70,7 @@ module.exports = function (db, module) { if (err || !data) { return callback(err); } + if (reverse) { data.reverse(); } @@ -117,12 +118,12 @@ module.exports = function (db, module) { query.score.$lte = max; } - var fields = { _id: 0, value: 1 }; - if (withScores) { - fields.score = 1; + var fields = { _id: 0, _key: 0 }; + if (!withScores) { + fields.score = 0; } - db.collection('objects').find(query, { fields: fields }) + db.collection('objects').find(query, { projection: fields }) .limit(count) .skip(start) .sort({ score: sort }) @@ -155,7 +156,7 @@ module.exports = function (db, module) { query.score.$lte = max; } - db.collection('objects').count(query, function (err, count) { + db.collection('objects').countDocuments(query, function (err, count) { callback(err, count || 0); }); }; @@ -164,7 +165,7 @@ module.exports = function (db, module) { if (!key) { return callback(null, 0); } - db.collection('objects').count({ _key: key }, function (err, count) { + db.collection('objects').countDocuments({ _key: key }, function (err, count) { count = parseInt(count, 10); callback(err, count || 0); }); @@ -220,7 +221,7 @@ module.exports = function (db, module) { return callback(err, null); } - db.collection('objects').count({ + db.collection('objects').countDocuments({ $or: [ { _key: key, @@ -273,7 +274,7 @@ module.exports = function (db, module) { return callback(null, null); } value = helpers.valueToString(value); - db.collection('objects').findOne({ _key: key, value: value }, { fields: { _id: 0, score: 1 } }, function (err, result) { + db.collection('objects').findOne({ _key: key, value: value }, { projection: { _id: 0, _key: 0, value: 0 } }, function (err, result) { callback(err, result ? result.score : null); }); }; @@ -283,7 +284,7 @@ module.exports = function (db, module) { return callback(); } value = helpers.valueToString(value); - db.collection('objects').find({ _key: { $in: keys }, value: value }, { _id: 0, _key: 1, score: 1 }).toArray(function (err, result) { + db.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, value: 0 } }).toArray(function (err, result) { if (err) { return callback(err); } @@ -306,7 +307,7 @@ module.exports = function (db, module) { return callback(null, null); } values = values.map(helpers.valueToString); - db.collection('objects').find({ _key: key, value: { $in: values } }, { _id: 0, value: 1, score: 1 }).toArray(function (err, result) { + db.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0 } }).toArray(function (err, result) { if (err) { return callback(err); } @@ -333,7 +334,7 @@ module.exports = function (db, module) { return callback(); } value = helpers.valueToString(value); - db.collection('objects').findOne({ _key: key, value: value }, { _id: 0, value: 1 }, function (err, result) { + db.collection('objects').findOne({ _key: key, value: value }, { projection: { _id: 0, _key: 0, score: 0 } }, function (err, result) { callback(err, !!result); }); }; @@ -343,17 +344,19 @@ module.exports = function (db, module) { return callback(); } values = values.map(helpers.valueToString); - db.collection('objects').find({ _key: key, value: { $in: values } }, { fields: { _id: 0, value: 1 } }).toArray(function (err, results) { + db.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0, score: 0 } }).toArray(function (err, results) { if (err) { return callback(err); } - - results = results.map(function (item) { - return item.value; + var isMember = {}; + results.forEach(function (item) { + if (item) { + isMember[item.value] = true; + } }); values = values.map(function (value) { - return results.indexOf(value) !== -1; + return !!isMember[value]; }); callback(null, values); }); @@ -364,17 +367,19 @@ module.exports = function (db, module) { return callback(); } value = helpers.valueToString(value); - db.collection('objects').find({ _key: { $in: keys }, value: value }, { fields: { _id: 0, _key: 1, value: 1 } }).toArray(function (err, results) { + db.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, score: 0 } }).toArray(function (err, results) { if (err) { return callback(err); } - - results = results.map(function (item) { - return item._key; + var isMember = {}; + results.forEach(function (item) { + if (item) { + isMember[item._key] = true; + } }); results = keys.map(function (key) { - return results.indexOf(key) !== -1; + return !!isMember[key]; }); callback(null, results); }); @@ -384,7 +389,7 @@ module.exports = function (db, module) { if (!Array.isArray(keys) || !keys.length) { return callback(null, []); } - db.collection('objects').find({ _key: { $in: keys } }, { _id: 0, _key: 1, value: 1 }).sort({ score: 1 }).toArray(function (err, data) { + db.collection('objects').find({ _key: { $in: keys } }, { projection: { _id: 0, score: 0 } }).sort({ score: 1 }).toArray(function (err, data) { if (err) { return callback(err); } @@ -412,7 +417,7 @@ module.exports = function (db, module) { value = helpers.valueToString(value); data.score = parseFloat(increment); - db.collection('objects').findAndModify({ _key: key, value: value }, {}, { $inc: data }, { new: true, upsert: true }, function (err, result) { + db.collection('objects').findOneAndUpdate({ _key: key, value: value }, { $inc: data }, { returnOriginal: false, upsert: true }, function (err, result) { // if there is duplicate key error retry the upsert // https://github.com/NodeBB/NodeBB/issues/4467 // https://jira.mongodb.org/browse/SERVER-14322 @@ -448,7 +453,7 @@ module.exports = function (db, module) { var query = { _key: key }; buildLexQuery(query, min, max); - db.collection('objects').find(query, { _id: 0, value: 1 }) + db.collection('objects').find(query, { projection: { _id: 0, _key: 0, score: 0 } }) .sort({ value: sort }) .skip(start) .limit(count === -1 ? 0 : count) @@ -469,7 +474,7 @@ module.exports = function (db, module) { var query = { _key: key }; buildLexQuery(query, min, max); - db.collection('objects').remove(query, function (err) { + db.collection('objects').deleteMany(query, function (err) { callback(err); }); }; @@ -499,13 +504,12 @@ module.exports = function (db, module) { module.processSortedSet = function (setKey, processFn, options, callback) { var done = false; var ids = []; - var project = { _id: 0, value: 1 }; - if (options.withScores) { - project.score = 1; + var project = { _id: 0, _key: 0 }; + if (!options.withScores) { + project.score = 0; } - var cursor = db.collection('objects').find({ _key: setKey }) + var cursor = db.collection('objects').find({ _key: setKey }, { projection: project }) .sort({ score: 1 }) - .project(project) .batchSize(options.batch); async.whilst( diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index b90501feee..e71bb0568a 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -14,7 +14,7 @@ module.exports = function (db, module) { value = helpers.valueToString(value); - db.collection('objects').update({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 }, function (err) { + db.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 }, function (err) { if (err && err.message.startsWith('E11000 duplicate key error')) { return process.nextTick(module.sortedSetAdd, key, score, value, callback); } diff --git a/src/database/mongo/sorted/remove.js b/src/database/mongo/sorted/remove.js index c9bf121e10..80f9221604 100644 --- a/src/database/mongo/sorted/remove.js +++ b/src/database/mongo/sorted/remove.js @@ -12,16 +12,16 @@ module.exports = function (db, module) { return callback(); } if (Array.isArray(key) && Array.isArray(value)) { - db.collection('objects').remove({ _key: { $in: key }, value: { $in: value } }, done); + db.collection('objects').deleteMany({ _key: { $in: key }, value: { $in: value } }, done); } else if (Array.isArray(value)) { value = value.map(helpers.valueToString); - db.collection('objects').remove({ _key: key, value: { $in: value } }, done); + db.collection('objects').deleteMany({ _key: key, value: { $in: value } }, done); } else if (Array.isArray(key)) { value = helpers.valueToString(value); - db.collection('objects').remove({ _key: { $in: key }, value: value }, done); + db.collection('objects').deleteMany({ _key: { $in: key }, value: value }, done); } else { value = helpers.valueToString(value); - db.collection('objects').remove({ _key: key, value: value }, done); + db.collection('objects').deleteOne({ _key: key, value: value }, done); } }; @@ -32,7 +32,7 @@ module.exports = function (db, module) { } value = helpers.valueToString(value); - db.collection('objects').remove({ _key: { $in: keys }, value: value }, function (err) { + db.collection('objects').deleteMany({ _key: { $in: keys }, value: value }, function (err) { callback(err); }); }; @@ -52,7 +52,7 @@ module.exports = function (db, module) { query.score.$lte = parseFloat(max); } - db.collection('objects').remove(query, function (err) { + db.collection('objects').deleteMany(query, function (err) { callback(err); }); }; diff --git a/src/upgrades/1.7.3/key_value_schema_change.js b/src/upgrades/1.7.3/key_value_schema_change.js index a8abefb10a..882f8ff200 100644 --- a/src/upgrades/1.7.3/key_value_schema_change.js +++ b/src/upgrades/1.7.3/key_value_schema_change.js @@ -23,7 +23,7 @@ module.exports = { var cursor; async.waterfall([ function (next) { - client.collection('objects').count({ + client.collection('objects').countDocuments({ _key: { $exists: true }, value: { $exists: true }, score: { $exists: false }, @@ -55,7 +55,7 @@ module.exports = { } delete item.expireAt; if (Object.keys(item).length === 3 && item.hasOwnProperty('_key') && item.hasOwnProperty('value')) { - client.collection('objects').update({ _key: item._key }, { $rename: { value: 'data' } }, next); + client.collection('objects').updateOne({ _key: item._key }, { $rename: { value: 'data' } }, next); } else { next(); } diff --git a/test/database/keys.js b/test/database/keys.js index 6b187b4e3d..1051658b26 100644 --- a/test/database/keys.js +++ b/test/database/keys.js @@ -192,6 +192,24 @@ describe('Key methods', function () { }); }); }); + + it('should rename multiple keys', function (done) { + db.sortedSetAdd('zsettorename', [1, 2, 3], ['value1', 'value2', 'value3'], function (err) { + assert.ifError(err); + db.rename('zsettorename', 'newzsetname', function (err) { + assert.ifError(err); + db.exists('zsettorename', function (err, exists) { + assert.ifError(err); + assert(!exists); + db.getSortedSetRange('newzsetname', 0, -1, function (err, values) { + assert.ifError(err); + assert.deepEqual(['value1', 'value2', 'value3'], values); + done(); + }); + }); + }); + }); + }); }); describe('type', function () { From ef55598822273d39fdae496e1f3d3d89a1eb3483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 26 Sep 2018 21:30:29 -0400 Subject: [PATCH 224/310] filter messages that are already inserted to DOM --- public/src/client/chats.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 77dbab488a..dac32dd4d5 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -121,6 +121,12 @@ define('forum/chats', [ if (!data) { return; } + data = data.filter(function (chatMsg) { + return !$('[component="chat/message"][data-mid="' + chatMsg.messageId + '"]').length; + }); + if (!data.length) { + return; + } messages.parseMessage(data, function (html) { var currentScrollTop = el.scrollTop(); var previousHeight = el[0].scrollHeight; From 95ace13599a9197ba33fb98bf13a83566e79e404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 26 Sep 2018 22:05:01 -0400 Subject: [PATCH 225/310] add loading=false --- public/src/client/chats.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index dac32dd4d5..861306f8f4 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -119,12 +119,14 @@ define('forum/chats', [ return app.alertError(err.message); } if (!data) { + loading = false; return; } data = data.filter(function (chatMsg) { return !$('[component="chat/message"][data-mid="' + chatMsg.messageId + '"]').length; }); if (!data.length) { + loading = false; return; } messages.parseMessage(data, function (html) { From 64f36db71a9988a5f9570228fb31d23c02f58ba8 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 27 Sep 2018 09:26:38 +0000 Subject: [PATCH 226/310] Latest translations and fallbacks --- public/language/lv/admin/advanced/errors.json | 2 +- public/language/lv/admin/advanced/logs.json | 4 +- .../lv/admin/appearance/customise.json | 2 +- .../language/lv/admin/appearance/themes.json | 2 +- .../language/lv/admin/development/logger.json | 2 +- .../language/lv/admin/general/dashboard.json | 2 +- .../language/lv/admin/general/homepage.json | 4 +- .../language/lv/admin/general/navigation.json | 6 +-- .../language/lv/admin/manage/categories.json | 2 +- .../lv/admin/manage/ip-blacklist.json | 2 +- .../lv/admin/manage/registration.json | 2 +- public/language/lv/admin/manage/users.json | 18 ++++----- public/language/lv/admin/menu.json | 6 +-- public/language/lv/admin/settings/email.json | 4 +- public/language/lv/admin/settings/post.json | 4 +- public/language/lv/admin/settings/user.json | 14 +++---- public/language/lv/email.json | 2 +- public/language/lv/error.json | 4 +- public/language/lv/global.json | 10 ++--- public/language/lv/login.json | 8 ++-- public/language/lv/recent.json | 24 ++++++------ public/language/lv/register.json | 38 +++++++++---------- public/language/lv/reset_password.json | 30 +++++++-------- public/language/lv/topic.json | 2 +- public/language/lv/user.json | 36 +++++++++--------- public/language/lv/users.json | 2 +- 26 files changed, 116 insertions(+), 116 deletions(-) diff --git a/public/language/lv/admin/advanced/errors.json b/public/language/lv/admin/advanced/errors.json index 546f0f1508..1f1801604c 100644 --- a/public/language/lv/admin/advanced/errors.json +++ b/public/language/lv/admin/advanced/errors.json @@ -6,7 +6,7 @@ "manage-error-log": "Manage Error Log", "export-error-log": "Export Error Log (CSV)", "clear-error-log": "Clear Error Log", - "route": "Route", + "route": "Ceļš", "count": "Count", "no-routes-not-found": "Hooray! No 404 errors!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", diff --git a/public/language/lv/admin/advanced/logs.json b/public/language/lv/admin/advanced/logs.json index b9de400e1c..40b68f0a31 100644 --- a/public/language/lv/admin/advanced/logs.json +++ b/public/language/lv/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "Logs", + "logs": "Žurnāli", "control-panel": "Logs Control Panel", - "reload": "Reload Logs", + "reload": "Pārlādēt žurnālus", "clear": "Clear Logs", "clear-success": "Logs Cleared!" } \ No newline at end of file diff --git a/public/language/lv/admin/appearance/customise.json b/public/language/lv/admin/appearance/customise.json index 3d62c38ae6..51b36bf8be 100644 --- a/public/language/lv/admin/appearance/customise.json +++ b/public/language/lv/admin/appearance/customise.json @@ -11,6 +11,6 @@ "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": "Iespējot pielāgotu galveni", - "custom-css.livereload": "Enable Live Reload", + "custom-css.livereload": "Iespējot dzīvo pārlādēšanu", "custom-css.livereload.description": "Iespējot šo, lai piespiestu visas tiešsaistes sesijas ikvienā no Tava konta esošajām ierīcēm atsvaidzināt katru reizi, kad noklikšķini uz Saglabāt" } \ No newline at end of file diff --git a/public/language/lv/admin/appearance/themes.json b/public/language/lv/admin/appearance/themes.json index eaaee96e89..67354f51ab 100644 --- a/public/language/lv/admin/appearance/themes.json +++ b/public/language/lv/admin/appearance/themes.json @@ -5,7 +5,7 @@ "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", + "theme-changed": "Tēma ir mainīta", "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", "restart-to-activate": "Please rebuild and restart your NodeBB to fully activate this theme." } \ No newline at end of file diff --git a/public/language/lv/admin/development/logger.json b/public/language/lv/admin/development/logger.json index 6ab9558149..45c93db529 100644 --- a/public/language/lv/admin/development/logger.json +++ b/public/language/lv/admin/development/logger.json @@ -4,7 +4,7 @@ "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", "enable-http": "Enable HTTP logging", "enable-socket": "Enable socket.io event logging", - "file-path": "Path to log file", + "file-path": "Ceļš uz žurnāla failu", "file-path-placeholder": "/path/to/log/file.log ::: leave blank to log to your terminal", "control-panel": "Logger Control Panel", diff --git a/public/language/lv/admin/general/dashboard.json b/public/language/lv/admin/general/dashboard.json index 260a80880b..0df46502ea 100644 --- a/public/language/lv/admin/general/dashboard.json +++ b/public/language/lv/admin/general/dashboard.json @@ -59,7 +59,7 @@ "on-categories": "On categories list", "reading-posts": "Reading posts", "browsing-topics": "Browsing topics", - "recent": "Recent", + "recent": "Nesenie", "unread": "Nelasītie", "high-presence-topics": "High Presence Topics", diff --git a/public/language/lv/admin/general/homepage.json b/public/language/lv/admin/general/homepage.json index 49dc5a99fb..ce721feeab 100644 --- a/public/language/lv/admin/general/homepage.json +++ b/public/language/lv/admin/general/homepage.json @@ -1,8 +1,8 @@ { "home-page": "Sākumlapa", "description": "Choose what page is shown when users navigate to the root URL of your forum.", - "home-page-route": "Sākumlapa adrese", - "custom-route": "Pielāgotā adrese", + "home-page-route": "Sākumlapas ceļš", + "custom-route": "Pielāgots ceļš", "allow-user-home-pages": "Atļaut lietotāju mājaslapas", "home-page-title": "Sākumlapas virsraksts (pēc noklusējuma \"Sākums\")" } \ No newline at end of file diff --git a/public/language/lv/admin/general/navigation.json b/public/language/lv/admin/general/navigation.json index 4b08a5e323..c7b318cf1d 100644 --- a/public/language/lv/admin/general/navigation.json +++ b/public/language/lv/admin/general/navigation.json @@ -1,7 +1,7 @@ { "icon": "Icon:", - "change-icon": "change", - "route": "Route:", + "change-icon": "izmaiņa", + "route": "Ceļš:", "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", @@ -19,7 +19,7 @@ "btn.enable": "Enable", "available-menu-items": "Available Menu Items", - "custom-route": "Pielāgotā adrese", + "custom-route": "Pielāgots ceļš", "core": "core", "plugin": "plugin" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 6198b5ffbf..decac6fa20 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -8,7 +8,7 @@ "text-color": "Text Colour", "bg-image-size": "Background Image Size", "custom-class": "Pielāgotā klase", - "num-recent-replies": "# of Recent Replies", + "num-recent-replies": "Neseno atbilžu skaits", "ext-link": "External Link", "is-section": "Treat this category as a section", "upload-image": "Upload Image", diff --git a/public/language/lv/admin/manage/ip-blacklist.json b/public/language/lv/admin/manage/ip-blacklist.json index 88e5ea7db5..b59265bfd0 100644 --- a/public/language/lv/admin/manage/ip-blacklist.json +++ b/public/language/lv/admin/manage/ip-blacklist.json @@ -9,7 +9,7 @@ "hint-2": "You can add in comments by starting lines with the # symbol.", "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-invalid": "Šie %1 noteikumi nav derīgi:", "alerts.applied-success": "Blacklist Applied", diff --git a/public/language/lv/admin/manage/registration.json b/public/language/lv/admin/manage/registration.json index e49eff8432..7f12820c33 100644 --- a/public/language/lv/admin/manage/registration.json +++ b/public/language/lv/admin/manage/registration.json @@ -3,7 +3,7 @@ "description": "There are no users in the registration queue.
To enable this feature, go to Settings → User → User Registration and set Registration Type to \"Admin Approval\".", "list.name": "Name", - "list.email": "Email", + "list.email": "E-pasta adrese", "list.ip": "IP", "list.time": "Time", "list.username-spam": "Frequency: %1 Appears: %2 Confidence: %3", diff --git a/public/language/lv/admin/manage/users.json b/public/language/lv/admin/manage/users.json index 703e12c9fa..a290182c02 100644 --- a/public/language/lv/admin/manage/users.json +++ b/public/language/lv/admin/manage/users.json @@ -5,11 +5,11 @@ "remove-admin": "Remove Admin", "validate-email": "Validate Email", "send-validation-email": "Send Validation Email", - "password-reset-email": "Send Password Reset Email", + "password-reset-email": "Sūtīt paroles atiestatīšanas e-pastu", "ban": "Bloķēt lietotāju(-s)", "temp-ban": "Bloķēt lietotāju(-s) uz laiku", "unban": "Atbloķēt lietotāju(-s)", - "reset-lockout": "Reset Lockout", + "reset-lockout": "Atiestatīt bloķēšanu", "reset-flags": "Atiestatīt atzīmes", "delete": "Delete User(s)", "purge": "Delete User(s) and Content", @@ -31,7 +31,7 @@ "search.uid-placeholder": "Ievadi meklējamo lietotāju", "search.username": "By User Name", "search.username-placeholder": "Ievadi meklējamo lietotājvārdu", - "search.email": "By Email", + "search.email": "Pa e-pastu", "search.email-placeholder": "Ievadi meklējamo e-pasta adresi", "search.ip": "By IP Address", "search.ip-placeholder": "Ievadi meklējamo IP adresi", @@ -43,7 +43,7 @@ "users.uid": "uid", "users.username": "username", - "users.email": "email", + "users.email": "e-pasta adrese", "users.postcount": "postcount", "users.reputation": "ranga punkti", "users.flags": "atzīmes", @@ -52,8 +52,8 @@ "users.banned": "bloķētie", "create.username": "User Name", - "create.email": "Email", - "create.email-placeholder": "Email of this user", + "create.email": "E-pasta adrese", + "create.email-placeholder": "Šī lietotāja e-pasta adrese", "create.password": "Password", "create.password-confirm": "Confirm Password", @@ -68,7 +68,7 @@ "alerts.ban-success": "Lietotājs(-i) bloķēts(-i)!", "alerts.button-ban-x": "Bloķēt %1 lietotāju(-s)", "alerts.unban-success": "Lietotājs(-i) atbloķēts(-i)", - "alerts.lockout-reset-success": "Lockout(s) reset!", + "alerts.lockout-reset-success": "Bloķēšana atiestatīta!", "alerts.flag-reset-success": "Atzīme(-s) atiestīta(-s)!", "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", "alerts.make-admin-success": "User is now administrator.", @@ -82,7 +82,7 @@ "alerts.remove-moderator-success": "User is no longer moderator.", "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", "alerts.validate-email-success": "Emails validated", - "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", + "alerts.password-reset-confirm": "Vai vēlies nosūtīt paroles atiestatīšanas e-pastu(-s) šim(-iem) lietotājam(-iem)?", "alerts.confirm-delete": "Warning!
Do you really want to delete user(s)?
This action is not reversable! Only the user account will be deleted, their posts and topics will remain.", "alerts.delete-success": "User(s) Deleted!", "alerts.confirm-purge": "Warning!
Do you really want to delete user(s) and their content?
This action is not reversable! All user data and content will be erased!", @@ -93,7 +93,7 @@ "alerts.error-x": "Error

%1

", "alerts.create-success": "User created!", - "alerts.prompt-email": "Email: ", + "alerts.prompt-email": "E-pasta adrese:", "alerts.email-sent-to": "Uzaicinājuma e-pasta ir nosūtīts %1", "alerts.x-users-found": "Atrasts %1 lietotājs(-i)! Meklēšana ilga 20 ms." } \ No newline at end of file diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index 8d78f84c1a..df84a42bc0 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -22,7 +22,7 @@ "section-settings": "Settings", "settings/general": "General", "settings/reputation": "Ranga punkti", - "settings/email": "Email", + "settings/email": "E-pasta adrese", "settings/user": "User", "settings/group": "Group", "settings/guest": "Guests", @@ -57,7 +57,7 @@ "section-advanced": "Advanced", "advanced/database": "Database", "advanced/events": "Events", - "advanced/logs": "Logs", + "advanced/logs": "Žurnāli", "advanced/errors": "Errors", "advanced/cache": "Cache", "development/logger": "Logger", @@ -65,7 +65,7 @@ "rebuild-and-restart-forum": "Rebuild & Restart Forum", "restart-forum": "Restart Forum", - "logout": "Log out", + "logout": "Izlogoties", "view-forum": "View Forum", "search.placeholder": "Search for settings", diff --git a/public/language/lv/admin/settings/email.json b/public/language/lv/admin/settings/email.json index 09ea438384..c375add736 100644 --- a/public/language/lv/admin/settings/email.json +++ b/public/language/lv/admin/settings/email.json @@ -1,6 +1,6 @@ { - "email-settings": "Email Settings", - "address": "Email Address", + "email-settings": "E-pasta iestatījumi", + "address": "E-pasta adrese", "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", diff --git a/public/language/lv/admin/settings/post.json b/public/language/lv/admin/settings/post.json index f8dac1565e..0f2df92fdf 100644 --- a/public/language/lv/admin/settings/post.json +++ b/public/language/lv/admin/settings/post.json @@ -36,8 +36,8 @@ "unread": "Nelasītie iestatījumi", "unread.cutoff": "Unread cutoff days", "unread.min-track-last": "Minimum posts in topic before tracking last read", - "recent": "Recent Settings", - "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", + "recent": "Nesenie iestatījumi", + "recent.categoryFilter.disable": "Atspējot tematu filtrēšanu ignorētās kategorijās /recent lapā", "signature": "Signature Settings", "signature.disable": "Disable signatures", "signature.no-links": "Disable links in signatures", diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json index 08ef4627ee..3db74d22b0 100644 --- a/public/language/lv/admin/settings/user.json +++ b/public/language/lv/admin/settings/user.json @@ -5,13 +5,13 @@ "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-email": "Lietotājvārds vai e-pasta adrese", "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", + "allow-login-with.email": "Tikai e-pasti", "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", + "disable-username-changes": "Atspējot lietotājvārda izmaiņas", + "disable-email-changes": "Atspējot e-pasta adreses izmaiņas", + "disable-password-changes": "Atspējot paroles izmaiņas", "allow-account-deletion": "Allow account deletion", "user-info-private": "Slēpt lietotāju sarakstu un datus no viesiem", "hide-fullname": "Slēpt vārdu un uzvārdu no lietotājiem", @@ -21,11 +21,11 @@ "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": "Ielogošanās mēģinājumi stundā", "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": "Dienas, lai atcerētos lietotāju tiešsaistes sesijas", - "password-expiry-days": "Force password reset after a set number of days", + "password-expiry-days": "Piespiest paroles atiestatīšanu pēc noteiktā dienu skaita", "registration": "Lietotāju reģistrācija", "registration-type": "Reģistrācijas veids", "registration-type.normal": "Normal", diff --git a/public/language/lv/email.json b/public/language/lv/email.json index fb3ac8f0a7..40279647f2 100644 --- a/public/language/lv/email.json +++ b/public/language/lv/email.json @@ -8,7 +8,7 @@ "email.verify.text1": "Tava e-pasta adrese ir mainījusies", "welcome.text1": "Paldies, ka reģistrējies %1!", "welcome.text2": "Lai pilnībā aktivizētu Tavu kontu, mums ir jāpārliecinās, ka Tev pieder e-pasta adrese, ar ko reģistrējies.", - "welcome.text3": "Administrators ir pieņēmis Tavu reģistrācijas pieteikumu. Tu tagad vari pieteikties ar savu lietotājvārdu un paroli.", + "welcome.text3": "Administrators ir pieņēmis Tavu reģistrācijas pieteikumu. Tu tagad vari ielogoties ar savu lietotājvārdu un paroli.", "welcome.cta": "Noklikšķini, lai apstiprinātu savu e-pasta adresi", "invitation.text1": "%1 ir uzaicinājis Tevi pievienoties %2", "invitation.text2": "Tavs uzaicinājums beigsies %1 dienu laikā.", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index 4df14c5b69..ec32147d2d 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -14,7 +14,7 @@ "invalid-title": "Nederīgs virsraksts", "invalid-user-data": "Nederīgi lietotāja dati", "invalid-password": "Nederīga parole", - "invalid-login-credentials": "Nederīgi pieteikšanās dati", + "invalid-login-credentials": "Nederīgi ielogošanās dati", "invalid-username-or-password": "Lūdzu, norādi gan lietotājvārdu, gan paroli", "invalid-search-term": "Nederīga meklēšanas frāze", "invalid-url": "Nederīga saite\n", @@ -145,7 +145,7 @@ "no-users-in-room": "Šajā istabā nav lietotāju", "cant-kick-self": "Tu nevari sevi izslēgt no grupas", "no-users-selected": "Nav atlasīts neviens lietotājs(-i)", - "invalid-home-page-route": "Nederīga sākumlapas adrese", + "invalid-home-page-route": "Nederīgs sākumlapas ceļš", "invalid-session": "Tiešsaistes sesijas nesakrīt", "invalid-session-text": "Izskatās, ka Tava tiešsaistes sesija vairs nav aktīva vai vairs nesakrīt ar serveri. Lūdzu, atsvaidzini šo lapu.", "no-topics-selected": "Nav atlasīts neviens temats", diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 887346cb10..0e4fb52696 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -4,7 +4,7 @@ "buttons.close": "Aizvērt", "403.title": "Piekļuve liegta", "403.message": "Šķiet, ka esi uznācis uz lapu, kurai Tev nav piekļuves.", - "403.login": "Varbūt Tev vajadzētu mēģināt pierakstīties?", + "403.login": "Varbūt Tev vajadzētu mēģināt ielogoties?", "404.title": "Nav atrasts", "404.message": "Šķiet, ka esi uznācis uz lapu, kura neeksistē. Atgriezies sākumlapā.", "500.title": "Iekšēja kļūda.", @@ -12,12 +12,12 @@ "400.title": "Nepareizs pieprasījums.", "400.message": "Šķiet, ka šī saite ir nepareiza, lūdzu, pārbaudi un mēģini vēlreiz. Pretējā gadījumā atgriezies sākumlapā.", "register": "Reģistrēties", - "login": "Pieteikties", - "please_log_in": "Lūdzu, pieteikties", + "login": "Ielogoties", + "please_log_in": "Lūdzu, ielogoties", "logout": "Izlogoties", - "posting_restriction_info": "Pašlaik publicēšana pieejama tikai reģistrētiem biedriem, lai pieteiktos, noklikšķini šeit.", + "posting_restriction_info": "Pašlaik publicēšana pieejama tikai reģistrētiem biedriem, lai ielogotos, noklikšķini šeit.", "welcome_back": "Laipni lūdzam atpakaļ", - "you_have_successfully_logged_in": "Tu esi veiksmīgi pieteicies", + "you_have_successfully_logged_in": "Tu esi veiksmīgi ielogojies", "save_changes": "Saglabāt izmaiņas", "save": "Saglabāt", "close": "Aizvērt", diff --git a/public/language/lv/login.json b/public/language/lv/login.json index 795c60a163..78c696bc6d 100644 --- a/public/language/lv/login.json +++ b/public/language/lv/login.json @@ -1,12 +1,12 @@ { - "username-email": "Lietotājvārds / parole", + "username-email": "Lietotājvārds / e-pasta adrese", "username": "Lietotājvārds", "email": "E-pasta adrese", "remember_me": "Atcerēties mani?", "forgot_password": "Aizmirsi paroli?", "alternative_logins": "Alternatīvie lietotājvārdi", - "failed_login_attempt": "Tev pieteikties neveiksmējās", - "login_successful": "Tu esi veiksmīgi pieteicies!", + "failed_login_attempt": "Tev ielogoties neveiksmējās", + "login_successful": "Tu esi veiksmīgi ielogojies!", "dont_have_account": "Vai Tev nav konta?", - "logged-out-due-to-inactivity": "Neaktivitātes dēļ Tu esi izrakstīts no administrācijas vadības paneļa" + "logged-out-due-to-inactivity": "Neaktivitātes dēļ Tu esi izlogots no administrācijas vadības paneļa" } \ No newline at end of file diff --git a/public/language/lv/recent.json b/public/language/lv/recent.json index b2a40cd9e6..a1e07dad2e 100644 --- a/public/language/lv/recent.json +++ b/public/language/lv/recent.json @@ -1,19 +1,19 @@ { - "title": "Recent", - "day": "Day", - "week": "Week", - "month": "Month", - "year": "Year", - "alltime": "All Time", - "no_recent_topics": "There are no recent topics.", - "no_popular_topics": "Populāras tēmas nav", + "title": "Nesenie", + "day": "Šodien", + "week": "Šonedēļ", + "month": "Šomēnes", + "year": "Šogad", + "alltime": "Visu laiku", + "no_recent_topics": "Nesenie temati nav.", + "no_popular_topics": "Populāras tēmas nav.", "there-is-a-new-topic": "Ir jauns temats.", "there-is-a-new-topic-and-a-new-post": "Ir jauns temats un jauna ziņa.", "there-is-a-new-topic-and-new-posts": "Ir jauns temats un %1 jaunas ziņas.", - "there-are-new-topics": "Ir %1 jaunas ziņas.", + "there-are-new-topics": "Ir %1 jauni temati.", "there-are-new-topics-and-a-new-post": "Ir %1 jauni temati un jauna ziņa.", "there-are-new-topics-and-new-posts": "Ir %1 jauni temati un %2 jaunas ziņas.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "there-is-a-new-post": "Ir jauna ziņa.", + "there-are-new-posts": "Ir %1 jaunas ziņas.", + "click-here-to-reload": "Noklikšķini, lai pārlādētu." } \ No newline at end of file diff --git a/public/language/lv/register.json b/public/language/lv/register.json index 4b7f90412f..11ce2b6767 100644 --- a/public/language/lv/register.json +++ b/public/language/lv/register.json @@ -1,26 +1,26 @@ { - "register": "Register", + "register": "Reģistrēties", "cancel_registration": "Atcelt reģistrācijas pieteikumu", "help.email": "Pēc noklusējuma Tava e-pasta adrese nebūs redzama ārpus NodeBB.", - "help.username_restrictions": "A unique username between %1 and %2 characters. Others can mention you with @username.", - "help.minimum_password_length": "Your password's length must be at least %1 characters.", - "email_address": "Email Address", - "email_address_placeholder": "Enter Email Address", - "username": "Username", - "username_placeholder": "Enter Username", - "password": "Password", - "password_placeholder": "Enter Password", - "confirm_password": "Confirm Password", - "confirm_password_placeholder": "Confirm Password", - "register_now_button": "Register Now", + "help.username_restrictions": "Unikāls lietotājvārds starp %1 un %2 rakstzīmēm. Citi var pieminēt Tevi ar @lietotājvārds.", + "help.minimum_password_length": "Tavas paroles garumam jābūt vismaz %1 rakstzīmēm.", + "email_address": "E-pasta adrese", + "email_address_placeholder": "Ievadīt e-pasta adresi", + "username": "Lietotājvārds", + "username_placeholder": "Ievadīt lietotājvārdu", + "password": "Parole", + "password_placeholder": "Ievadīt paroli", + "confirm_password": "Apstiprināt paroli", + "confirm_password_placeholder": "Apstiprināt paroli", + "register_now_button": "Reģistreties tagad", "alternative_registration": "Alternatīva reģistrācija", - "terms_of_use": "Terms of Use", - "agree_to_terms_of_use": "I agree to the Terms of Use", - "terms_of_use_error": "You must agree to the Terms of Use", + "terms_of_use": "Lietošanas noteikumi", + "agree_to_terms_of_use": "Es piekrītu lietošanas noteikumiem", + "terms_of_use_error": "Tev ir jāpiekrīt lietošanas noteikumiem", "registration-added-to-queue": "Tavs reģistrācijas pieteikums ir pievienots apstiprināšanas rindai. Tu saņemsi e-pastu, kad to pieņems administrators.", - "interstitial.intro": "We require some additional information before we can create your account.", + "interstitial.intro": "Pirms varam izveidot Tavu kontu, mums ir nepieciešama papildu informācija.", "interstitial.errors-found": "Mēs nevarējām pabeigt jūsu reģistrāciju:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." + "gdpr_agree_data": "Es piekrītu manas personas informācijas vākšanai un apstrādei šajā vietnē.", + "gdpr_agree_email": "Es piekrītu saņemt sakopojumu un paziņojumu e-pastus no šīs vietnes.", + "gdpr_consent_denied": "Tev ir jādod piekrišana šai vietnei, lai savāktu / apstrādātu Tavu informāciju un nosūtītu Tev e-pastus." } \ No newline at end of file diff --git a/public/language/lv/reset_password.json b/public/language/lv/reset_password.json index 26ce208d0d..bf016e0faa 100644 --- a/public/language/lv/reset_password.json +++ b/public/language/lv/reset_password.json @@ -1,17 +1,17 @@ { - "reset_password": "Reset Password", - "update_password": "Update Password", - "password_changed.title": "Password Changed", - "password_changed.message": "

Password successfully reset, please log in again.", - "wrong_reset_code.title": "Incorrect Reset Code", - "wrong_reset_code.message": "The reset code received was incorrect. Please try again, or request a new reset code.", - "new_password": "New Password", - "repeat_password": "Confirm Password", - "enter_email": "Please enter your email address and we will send you an email with instructions on how to reset your account.", - "enter_email_address": "Enter Email Address", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", - "invalid_email": "Invalid Email / Email does not exist!", - "password_too_short": "The password entered is too short, please pick a different password.", - "passwords_do_not_match": "The two passwords you've entered do not match.", - "password_expired": "Your password has expired, please choose a new password" + "reset_password": "Atiestatīt paroli", + "update_password": "Atjaunināt paroli", + "password_changed.title": "Parole ir mainīta", + "password_changed.message": "

Parole ir veiksmīgi atiestatīta, lūdzupieraksties vēlreiz.", + "wrong_reset_code.title": "Nepareizs atiestatīšanas kods", + "wrong_reset_code.message": "Saņemtais atiestatīšanas kods ir nepareizs. Lūdzu, mēģini vēlreiz vai pieprasi jaunu atiestatīšanas kodu.", + "new_password": "Jaunā parole", + "repeat_password": "Apstiprināt paroli", + "enter_email": "Ievadi savu e-pasta adresi, un mēs nosūtīsim Tev e-pastu ar norādījumiem par to, kā atiestatīt Tavu kontu.", + "enter_email_address": "Ievadīt e-pasta adresi", + "password_reset_sent": "Paroles atiestatīšanas e-pasts ir nosūtīts uz norādīto e-pasta adresi. Lūdzu, ņemi vērā, ka minūtē tiks nosūtīts tikai viens e-pasts.", + "invalid_email": "Nederīga e-pasta adrese / e-pasta adrese neeksistē!", + "password_too_short": "Ievadītā parole ir pārāk īsa, lūdzu, izvēlies citu paroli.", + "passwords_do_not_match": "Abas ievadītās paroles nesakrīt.", + "password_expired": "Tava parole ir beigusies, lūdzu, izvēlies jaunu paroli" } \ No newline at end of file diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json index e6f0dea675..c35e404a29 100644 --- a/public/language/lv/topic.json +++ b/public/language/lv/topic.json @@ -17,7 +17,7 @@ "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", "reply-as-topic": "Reply as topic", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Ielogojies, lai atbildētu", "edit": "Edit", "delete": "Delete", "purge": "Purge", diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 94686b48d1..7f7fca9c31 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -5,7 +5,7 @@ "username": "User Name", "joindate": "Join Date", "postcount": "Post Count", - "email": "Email", + "email": "E-pasta adrese", "confirm_email": "Confirm Email", "account_info": "Konta info", "ban_account": "Bloķēt kontu", @@ -44,18 +44,18 @@ "unfollow": "Pārtraukt sekot", "more": "More", "profile_update_success": "Profile has been updated successfully!", - "change_picture": "Change Picture", - "change_username": "Change Username", - "change_email": "Change Email", + "change_picture": "Mainīt bildi", + "change_username": "Mainīt lietotājvārdu", + "change_email": "Mainīt e-pasta adresi", "edit": "Edit", "edit-profile": "Edit Profile", "default_picture": "Default Icon", - "uploaded_picture": "Uploaded Picture", - "upload_new_picture": "Upload New Picture", - "upload_new_picture_from_url": "Upload New Picture From URL", + "uploaded_picture": "Augšupielādētā bilde", + "upload_new_picture": "Augšupielādēt jaunu bildi", + "upload_new_picture_from_url": "Augšupielādēt jaunu bildi no URL", "current_password": "Current Password", - "change_password": "Change Password", - "change_password_error": "Invalid Password!", + "change_password": "Mainīt paroli", + "change_password_error": "Nederīga parole!", "change_password_error_wrong_current": "Your current password is not correct!", "change_password_error_match": "Passwords must match!", "change_password_error_privileges": "You do not have the rights to change this password.", @@ -66,12 +66,12 @@ "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.", - "upload_picture": "Upload picture", - "upload_a_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_picture": "Augšupielādēt bildi", + "upload_a_picture": "Augšupielādēt bildi", + "remove_uploaded_picture": "Noņemt augšupielādēto bildi", + "upload_cover_picture": "Augšupielādēt vāka bildi", + "remove_cover_picture_confirm": "Vai tiešām vēlies noņemt vāka bildi?", + "crop_picture": "Apgriezt bildi", "upload_cropped_picture": "Crop and upload", "settings": "Settings", "show_email": "Rādīt manu e-pasta adresi", @@ -129,8 +129,8 @@ "select-homepage": "Izvēlēties sākumlapu", "homepage": "Sākumlapa", "homepage_description": "Izvēlies lapu, kuru izmantot kā foruma mājaslapu vai 'Nav', lai izmantotu noklusējuma sākumlapu.", - "custom_route": "Pielāgotā mājaslapas adrese", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", + "custom_route": "Pielāgots sākumlapas ceļš", + "custom_route_help": "Ievadīt ceļa nosaukumu bez iepriekšējās slīpsvītras (piemēram, \"recent\" vai \"popular\").", "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", @@ -146,7 +146,7 @@ "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", "info.username-history": "Username History", - "info.email-history": "Email History", + "info.email-history": "E-pastu vēsture", "info.moderation-note": "Moderation Note", "info.moderation-note.success": "Moderatora piezīmes saglabātas", "info.moderation-note.add": "Add note", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index 8d4b491d75..bfc64116ba 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -12,7 +12,7 @@ "invite": "Uzaicināt", "invitation-email-sent": "Uzaicinājuma e-pasta ir nosūtīts %1", "user_list": "User List", - "recent_topics": "Recent Topics", + "recent_topics": "Nesenie temati", "popular_topics": "Populārās tēmas", "unread_topics": "Nelasītie temati", "categories": "Categories", From 4b970a107209a1479ea30fff0f1ccd6aa0e83dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 27 Sep 2018 09:52:56 -0400 Subject: [PATCH 227/310] use lodash, load 3 posts per iteration --- src/topics/unread.js | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/topics/unread.js b/src/topics/unread.js index 275cfec69c..c8b3552af5 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -248,35 +248,33 @@ module.exports = function (Topics) { if (!params.blockedUids.length) { return setImmediate(callback, null, params.tids); } - params.topicScores = {}; - params.recentTids.forEach(function (topic) { - params.topicScores[topic.value] = topic.score; - }); + const topicScores = _.mapValues(_.keyBy(params.recentTids, 'value'), 'score'); - db.sortedSetScores('uid:' + params.uid + ':tids_read', params.tids, function (err, userScores) { + db.sortedSetScores('uid:' + params.uid + ':tids_read', params.tids, function (err, results) { if (err) { return callback(err); } - params.userScores = {}; - userScores.forEach(function (score, index) { - params.userScores[params.tids[index]] = score; - }); + const userScores = _.zipObject(params.tids, results); + async.filter(params.tids, function (tid, next) { - doesTidHaveUnblockedUnreadPosts(tid, params, next); + doesTidHaveUnblockedUnreadPosts(tid, { + blockedUids: params.blockedUids, + topicTimestamp: topicScores[tid], + userLastReadTimestamp: userScores[tid], + }, next); }, callback); }); } function doesTidHaveUnblockedUnreadPosts(tid, params, callback) { - var topicTimestamp = params.topicScores[tid]; - var userLastReadTimestamp = params.userScores[tid]; + var userLastReadTimestamp = params.userLastReadTimestamp; if (!userLastReadTimestamp) { return setImmediate(callback, null, true); } var start = 0; - var count = 5; + var count = 3; var done = false; - var hasUnblockedUnread = topicTimestamp > userLastReadTimestamp; + var hasUnblockedUnread = params.topicTimestamp > userLastReadTimestamp; async.whilst(function () { return !done; @@ -469,14 +467,7 @@ module.exports = function (Topics) { var read = !results.tids_unread[index] && (results.topicScores[index] < cutoff || !!(results.userScores[index] && results.userScores[index] >= results.topicScores[index])); - return { tid: tid, read: read }; - }); - - var topicScores = {}; - var userScores = {}; - tids.forEach(function (tid, index) { - topicScores[tid] = results.topicScores[index]; - userScores[tid] = results.userScores[index]; + return { tid: tid, read: read, index: index }; }); async.map(result, function (data, next) { @@ -484,8 +475,8 @@ module.exports = function (Topics) { return next(null, true); } doesTidHaveUnblockedUnreadPosts(data.tid, { - topicScores: topicScores, - userScores: userScores, + topicTimestamp: results.topicScores[data.index], + userLastReadTimestamp: results.userScores[data.index], blockedUids: results.blockedUids, }, function (err, hasUnblockedUnread) { if (err) { From ebabcc5e3c73f065fc1855dcc98465dab61293f9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 27 Sep 2018 13:45:49 -0400 Subject: [PATCH 228/310] if authenticate middleware is overridden by plugin, check for req.user and return notAllowed helper otherwise /cc @LudwikJaniuk --- src/middleware/user.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/middleware/user.js b/src/middleware/user.js index 10983cb4f6..3cc69a750d 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -25,7 +25,17 @@ module.exports = function (middleware) { req: req, res: res, next: function (err) { - auth.setAuthVars(req, res, function () { next(err); }); + if (err) { + return next(err); + } + + auth.setAuthVars(req, res, function () { + if (req.loggedIn && req.user && req.user.uid) { + return next(); + } + + controllers.helpers.notAllowed(req, res); + }); }, }); } From f95308bf3388d28a3354a13faac8f0fc4920658e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 28 Sep 2018 15:23:52 -0400 Subject: [PATCH 229/310] move sharp require into the method it is used in src/file.js --- src/file.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/file.js b/src/file.js index a4dd98212d..a1f5f0580c 100644 --- a/src/file.js +++ b/src/file.js @@ -4,7 +4,6 @@ var fs = require('fs'); var nconf = require('nconf'); var path = require('path'); var winston = require('winston'); -var sharp = require('sharp'); var mkdirp = require('mkdirp'); var mime = require('mime'); var graceful = require('graceful-fs'); @@ -107,7 +106,7 @@ file.isFileTypeAllowed = function (path, callback) { }); } - sharp(path, { + require('sharp')(path, { failOnError: true, }).metadata(function (err) { callback(err); From cf4ea94e6ddbaab0eb2b94edbae64759f860eb95 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 28 Sep 2018 16:02:03 -0500 Subject: [PATCH 230/310] Fix single-host-cluster socket.io (#6802) It was silently dropping every message because every node thought it was the master node. --- src/socket.io/index.js | 4 +--- src/socket.io/single-host-cluster.js | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 964ebf728c..4c772db131 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -28,9 +28,7 @@ Sockets.init = function (server) { }); if (nconf.get('singleHostCluster')) { - io.adapter(require('socket.io-adapter-cluster')({ - client: require('./single-host-cluster'), - })); + io.adapter(require('./single-host-cluster')); } else if (nconf.get('redis')) { io.adapter(require('../database/redis').socketAdapter()); } else { diff --git a/src/socket.io/single-host-cluster.js b/src/socket.io/single-host-cluster.js index c7ca938766..eef1a7a4a7 100644 --- a/src/socket.io/single-host-cluster.js +++ b/src/socket.io/single-host-cluster.js @@ -51,4 +51,17 @@ process.on('message', function (message) { } }); -module.exports = Client; +var adapter = require('socket.io-adapter-cluster')({ + client: Client, +}); +// Otherwise, every node thinks it is the master node and ignores messages +// because they are from "itself". +Object.defineProperty(adapter.prototype, 'id', { + get: function () { + return process.pid; + }, + set: function (id) { + // ignore + }, +}); +module.exports = adapter; From 36ae926196ea92e80564b54ee93b790a761c2768 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 28 Sep 2018 18:49:44 +0000 Subject: [PATCH 231/310] Update dependency eslint to v5.6.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 6ac849df78..1ae9d1c5b8 100644 --- a/install/package.json +++ b/install/package.json @@ -118,7 +118,7 @@ }, "devDependencies": { "coveralls": "3.0.2", - "eslint": "5.6.0", + "eslint": "5.6.1", "eslint-config-airbnb-base": "12.1.0", "eslint-plugin-import": "2.14.0", "grunt": "1.0.3", From d92ef9ca11eb71370d0a9935c5c39fe3a1f5e93b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 28 Sep 2018 23:13:07 -0400 Subject: [PATCH 232/310] remove id --- src/socket.io/single-host-cluster.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/single-host-cluster.js b/src/socket.io/single-host-cluster.js index eef1a7a4a7..b2645d6eb9 100644 --- a/src/socket.io/single-host-cluster.js +++ b/src/socket.io/single-host-cluster.js @@ -60,7 +60,7 @@ Object.defineProperty(adapter.prototype, 'id', { get: function () { return process.pid; }, - set: function (id) { + set: function () { // ignore }, }); From 944972c6f2d70921f0f1f28f0cbfd113e8b44659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 28 Sep 2018 23:57:00 -0400 Subject: [PATCH 233/310] change to series --- test/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/topics.js b/test/topics.js index cd15149d6e..7e903b0d9f 100644 --- a/test/topics.js +++ b/test/topics.js @@ -981,7 +981,7 @@ describe('Topic\'s', function () { var tid1; var tid3; before(function (done) { - async.parallel({ + async.series({ topic1: function (next) { topics.post({ uid: adminUid, tags: ['nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId }, next); }, From bf7523b8e48e219d9afc589392602d59f0af6b91 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 29 Sep 2018 09:26:30 +0000 Subject: [PATCH 234/310] Latest translations and fallbacks --- public/language/lv/admin/advanced/errors.json | 2 +- public/language/lv/admin/advanced/logs.json | 4 +- .../language/lv/admin/development/info.json | 2 +- public/language/lv/admin/extend/rewards.json | 4 +- public/language/lv/admin/extend/widgets.json | 6 +- .../language/lv/admin/general/dashboard.json | 2 +- .../language/lv/admin/general/navigation.json | 2 +- public/language/lv/admin/general/sounds.json | 2 +- .../language/lv/admin/manage/categories.json | 12 +- public/language/lv/admin/manage/groups.json | 10 +- .../language/lv/admin/manage/privileges.json | 6 +- public/language/lv/admin/manage/tags.json | 2 +- public/language/lv/admin/manage/users.json | 20 +-- public/language/lv/admin/menu.json | 4 +- .../language/lv/admin/settings/general.json | 8 +- .../lv/admin/settings/reputation.json | 2 +- .../language/lv/admin/settings/uploads.json | 2 +- public/language/lv/category.json | 4 +- public/language/lv/error.json | 4 +- public/language/lv/global.json | 2 +- public/language/lv/pages.json | 2 +- public/language/lv/search.json | 78 ++++----- public/language/lv/success.json | 6 +- public/language/lv/tags.json | 4 +- public/language/lv/topic.json | 160 +++++++++--------- public/language/lv/unread.json | 14 +- public/language/lv/uploads.json | 14 +- public/language/lv/user.json | 10 +- public/language/lv/users.json | 16 +- 29 files changed, 202 insertions(+), 202 deletions(-) diff --git a/public/language/lv/admin/advanced/errors.json b/public/language/lv/admin/advanced/errors.json index 1f1801604c..fd6d67629a 100644 --- a/public/language/lv/admin/advanced/errors.json +++ b/public/language/lv/admin/advanced/errors.json @@ -5,7 +5,7 @@ "error.503": "503 Service Unavailable", "manage-error-log": "Manage Error Log", "export-error-log": "Export Error Log (CSV)", - "clear-error-log": "Clear Error Log", + "clear-error-log": "Notīrīt kļūdu žurnālu", "route": "Ceļš", "count": "Count", "no-routes-not-found": "Hooray! No 404 errors!", diff --git a/public/language/lv/admin/advanced/logs.json b/public/language/lv/admin/advanced/logs.json index 40b68f0a31..605357cee1 100644 --- a/public/language/lv/admin/advanced/logs.json +++ b/public/language/lv/admin/advanced/logs.json @@ -2,6 +2,6 @@ "logs": "Žurnāli", "control-panel": "Logs Control Panel", "reload": "Pārlādēt žurnālus", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "clear": "Notīrīt žurnālus", + "clear-success": "Zurnāli notīrīti!" } \ No newline at end of file diff --git a/public/language/lv/admin/development/info.json b/public/language/lv/admin/development/info.json index 0a4ae6fe2c..fa59f8caf3 100644 --- a/public/language/lv/admin/development/info.json +++ b/public/language/lv/admin/development/info.json @@ -4,7 +4,7 @@ "host": "host", "pid": "pid", "nodejs": "nodejs", - "online": "online", + "online": "tiešsaistē", "git": "git", "memory": "memory", "load": "load", diff --git a/public/language/lv/admin/extend/rewards.json b/public/language/lv/admin/extend/rewards.json index 5383a90b33..015ef8dfe4 100644 --- a/public/language/lv/admin/extend/rewards.json +++ b/public/language/lv/admin/extend/rewards.json @@ -11,7 +11,7 @@ "control-panel": "Rewards Control", "new-reward": "New Reward", - "alert.delete-success": "Successfully deleted reward", + "alert.delete-success": "Veiksmīgi izdzēsts atalgojums", "alert.no-inputs-found": "Illegal reward - no inputs found!", - "alert.save-success": "Successfully saved rewards" + "alert.save-success": "Veiksmīgi saglabāts atalgojums" } \ No newline at end of file diff --git a/public/language/lv/admin/extend/widgets.json b/public/language/lv/admin/extend/widgets.json index 025f48b327..75cb84fe55 100644 --- a/public/language/lv/admin/extend/widgets.json +++ b/public/language/lv/admin/extend/widgets.json @@ -13,10 +13,10 @@ "container.panel-body": "Panel Body", "container.alert": "Alert", - "alert.confirm-delete": "Are you sure you wish to delete this widget?", + "alert.confirm-delete": "Vai tiešām vēlies izdzēst šo logrīku?", "alert.updated": "Widgets Updated", - "alert.update-success": "Successfully updated widgets", - "alert.clone-success": "Successfully cloned widgets", + "alert.update-success": "Veiksmīgi atjaunināti logrīki", + "alert.clone-success": "Veiksmīgi nozaroti logrīki", "error.select-clone": "Please select a page to clone from" } \ No newline at end of file diff --git a/public/language/lv/admin/general/dashboard.json b/public/language/lv/admin/general/dashboard.json index 0df46502ea..769401cf94 100644 --- a/public/language/lv/admin/general/dashboard.json +++ b/public/language/lv/admin/general/dashboard.json @@ -17,7 +17,7 @@ "stats.day": "Day", "stats.week": "Week", "stats.month": "Month", - "stats.all": "All Time", + "stats.all": "Visu laiku", "updates": "Updates", "running-version": "You are running NodeBB v%1.", diff --git a/public/language/lv/admin/general/navigation.json b/public/language/lv/admin/general/navigation.json index c7b318cf1d..d6e12b0b71 100644 --- a/public/language/lv/admin/general/navigation.json +++ b/public/language/lv/admin/general/navigation.json @@ -10,7 +10,7 @@ "properties": "Properties:", "only-admins": "Only display to Admins", "only-global-mods-and-admins": "Only display to Global Moderators and Admins", - "only-logged-in": "Only display to logged in users", + "only-logged-in": "Rādīt tikai ielogojušiem lietotājiem", "only-guest": "Only display to guests", "open-new-window": "Open in a new window", diff --git a/public/language/lv/admin/general/sounds.json b/public/language/lv/admin/general/sounds.json index e803819af5..916077360e 100644 --- a/public/language/lv/admin/general/sounds.json +++ b/public/language/lv/admin/general/sounds.json @@ -4,6 +4,6 @@ "play-sound": "Play", "incoming-message": "Incoming Message", "outgoing-message": "Outgoing Message", - "upload-new-sound": "Upload New Sound", + "upload-new-sound": "Augšupielādēt jaunu skaņu", "saved": "Iestatījumi saglabāti" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index decac6fa20..d6275ad322 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -11,8 +11,8 @@ "num-recent-replies": "Neseno atbilžu skaits", "ext-link": "External Link", "is-section": "Treat this category as a section", - "upload-image": "Upload Image", - "delete-image": "Remove", + "upload-image": "Augšupielātēt bildi", + "delete-image": "Noņemt", "category-image": "Category Image", "parent-category": "Parent Category", "optional-parent-category": "(Optional) Parent Category", @@ -51,10 +51,10 @@ "analytics.topics-daily": "Attēls 3 – Kategorijas jauni temati dienā", "analytics.posts-daily": "Attēls 4 – Kategorijas publicētās ziņas dienā", - "alert.created": "Created", - "alert.create-success": "Category successfully created!", + "alert.created": "Izveidotie", + "alert.create-success": "Kategorija veiksmīgi izveidota", "alert.none-active": "You have no active categories.", - "alert.create": "Create a Category", + "alert.create": "Izveidot kategoriju", "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", "alert.purge-success": "Category purged!", @@ -62,7 +62,7 @@ "alert.set-parent-category": "Set Parent Category", "alert.updated": "Updated Categories", "alert.updated-success": "Category IDs %1 successfully updated.", - "alert.upload-image": "Upload category image", + "alert.upload-image": "Augšupielādēt kategorijas bildi", "alert.find-user": "Find a User", "alert.user-search": "Meklēt lietotājus šeit", "alert.find-group": "Find a Group", diff --git a/public/language/lv/admin/manage/groups.json b/public/language/lv/admin/manage/groups.json index a7c97d8119..a6ed85f7de 100644 --- a/public/language/lv/admin/manage/groups.json +++ b/public/language/lv/admin/manage/groups.json @@ -5,12 +5,12 @@ "system": "System Group", "edit": "Edit", "search-placeholder": "Meklēt", - "create": "Create Group", + "create": "Izveidot grupu", "description-placeholder": "A short description about your group", - "create-button": "Create", + "create-button": "Izveidot", "alerts.create-failure": "Uh-Oh

There was a problem creating your group. Please try again later!

", - "alerts.confirm-delete": "Are you sure you wish to delete this group?", + "alerts.confirm-delete": "Vai tiešām vēlies izdzēst šo grupu?", "edit.name": "Name", "edit.description": "Description", @@ -29,7 +29,7 @@ "control-panel": "Groups Control Panel", "revert": "Revert", - "edit.no-users-found": "No Users Found", - "edit.confirm-remove-user": "Are you sure you want to remove this user?", + "edit.no-users-found": "Nav lietotāju", + "edit.confirm-remove-user": "Vai tiešām vēlies izdzēst šo lietotāju?", "edit.save-success": "Izmaiņas saglabātas" } \ No newline at end of file diff --git a/public/language/lv/admin/manage/privileges.json b/public/language/lv/admin/manage/privileges.json index 35d009e852..79763b6f36 100644 --- a/public/language/lv/admin/manage/privileges.json +++ b/public/language/lv/admin/manage/privileges.json @@ -3,8 +3,8 @@ "global.no-users": "No user-specific global privileges.", "chat": "Sarunāties", - "upload-images": "Upload Images", - "upload-files": "Upload Files", + "upload-images": "Augšupielādēt bildes", + "upload-files": "Augšupielādēt failus", "signature": "Signature", "ban": "Bloķēt", "search-content": "Meklēt saturā", @@ -14,7 +14,7 @@ "find-category": "Find Category", "access-category": "Access Category", "access-topics": "Access Topics", - "create-topics": "Create Topics", + "create-topics": "Izveidot tematus", "reply-to-topics": "Reply to Topics", "tag-topics": "Tag Topics", "edit-posts": "Edit Posts", diff --git a/public/language/lv/admin/manage/tags.json b/public/language/lv/admin/manage/tags.json index 3ab6749957..0e409acacd 100644 --- a/public/language/lv/admin/manage/tags.json +++ b/public/language/lv/admin/manage/tags.json @@ -4,7 +4,7 @@ "text-color": "Text Colour", "create-modify": "Izveidot & rediģēt birkas", "description": "Select tags via clicking and/or dragging, use shift to select multiple.", - "create": "Create Tag", + "create": "Izveidot birku", "modify": "Rediģēt birkas", "rename": "Pārdēvēt birkas", "delete": "Izdzēst atlasītās birkas", diff --git a/public/language/lv/admin/manage/users.json b/public/language/lv/admin/manage/users.json index a290182c02..ffba0ee8c3 100644 --- a/public/language/lv/admin/manage/users.json +++ b/public/language/lv/admin/manage/users.json @@ -2,7 +2,7 @@ "users": "Users", "edit": "Edit", "make-admin": "Make Admin", - "remove-admin": "Remove Admin", + "remove-admin": "Noņemt administratoru", "validate-email": "Validate Email", "send-validation-email": "Send Validation Email", "password-reset-email": "Sūtīt paroles atiestatīšanas e-pastu", @@ -13,7 +13,7 @@ "reset-flags": "Atiestatīt atzīmes", "delete": "Delete User(s)", "purge": "Delete User(s) and Content", - "download-csv": "Download CSV", + "download-csv": "Lejupielādēt CSV", "invite": "Uzaicināt", "new": "New User", @@ -35,7 +35,7 @@ "search.email-placeholder": "Ievadi meklējamo e-pasta adresi", "search.ip": "By IP Address", "search.ip-placeholder": "Ievadi meklējamo IP adresi", - "search.not-found": "User not found!", + "search.not-found": "Nav atrasts lietotājs!", "inactive.3-months": "3 months", "inactive.6-months": "6 months", @@ -48,7 +48,7 @@ "users.reputation": "ranga punkti", "users.flags": "atzīmes", "users.joined": "joined", - "users.last-online": "last online", + "users.last-online": "pēdējie tiešsaistē", "users.banned": "bloķētie", "create.username": "User Name", @@ -72,13 +72,13 @@ "alerts.flag-reset-success": "Atzīme(-s) atiestīta(-s)!", "alerts.no-remove-yourself-admin": "You can't remove yourself as Administrator!", "alerts.make-admin-success": "User is now administrator.", - "alerts.confirm-remove-admin": "Do you really want to remove this administrator?", + "alerts.confirm-remove-admin": "Vai tiešām vēlies noņemt šo administratoru?", "alerts.remove-admin-success": "User is no longer administrator.", "alerts.make-global-mod-success": "User is now global moderator.", - "alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?", + "alerts.confirm-remove-global-mod": "Vai tiešām vēlies noņemt šo globālo moderatoru?", "alerts.remove-global-mod-success": "User is no longer global moderator.", "alerts.make-moderator-success": "User is now moderator.", - "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", + "alerts.confirm-remove-moderator": "Vai tiešām vēlies noņemt šo moderatoru?", "alerts.remove-moderator-success": "User is no longer moderator.", "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", "alerts.validate-email-success": "Emails validated", @@ -86,12 +86,12 @@ "alerts.confirm-delete": "Warning!
Do you really want to delete user(s)?
This action is not reversable! Only the user account will be deleted, their posts and topics will remain.", "alerts.delete-success": "User(s) Deleted!", "alerts.confirm-purge": "Warning!
Do you really want to delete user(s) and their content?
This action is not reversable! All user data and content will be erased!", - "alerts.create": "Create User", - "alerts.button-create": "Create", + "alerts.create": "Izveidot lietotāju", + "alerts.button-create": "Izveidot", "alerts.button-cancel": "Cancel", "alerts.error-passwords-different": "Passwords must match!", "alerts.error-x": "Error

%1

", - "alerts.create-success": "User created!", + "alerts.create-success": "Lietotājs izveidots!", "alerts.prompt-email": "E-pasta adrese:", "alerts.email-sent-to": "Uzaicinājuma e-pasta ir nosūtīts %1", diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index df84a42bc0..b2f7ae77fc 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -17,7 +17,7 @@ "manage/post-queue": "Ziņu rinda", "manage/groups": "Groups", "manage/ip-blacklist": "IP adrešu melnais saraksts", - "manage/uploads": "Uploads", + "manage/uploads": "Augšupielādes", "section-settings": "Settings", "settings/general": "General", @@ -26,7 +26,7 @@ "settings/user": "User", "settings/group": "Group", "settings/guest": "Guests", - "settings/uploads": "Uploads", + "settings/uploads": "Augšupielādes", "settings/post": "Post", "settings/chat": "Sarunāties", "settings/pagination": "Numerācija", diff --git a/public/language/lv/admin/settings/general.json b/public/language/lv/admin/settings/general.json index 948123f7cb..cac6dd6c61 100644 --- a/public/language/lv/admin/settings/general.json +++ b/public/language/lv/admin/settings/general.json @@ -5,7 +5,7 @@ "title.url-placeholder": "The URL of the site title", "title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.", "title.name": "Your Community Name", - "title.show-in-header": "Show Site Title in Header", + "title.show-in-header": "Rādīt vietnes virsrakstu galvenē", "browser-title": "Browser Title", "browser-title-help": "If no browser title is specified, the site title will be used", "title-layout": "Title Layout", @@ -17,16 +17,16 @@ "logo": "Site Logo", "logo.image": "Image", "logo.image-placeholder": "Path to a logo to display on forum header", - "logo.upload": "Upload", + "logo.upload": "Augšupielādēt", "logo.url": "URL", "logo.url-placeholder": "The URL of the site logo", "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", "logo.alt-text": "Alt Text", "log.alt-text-placeholder": "Alternative text for accessibility", "favicon": "Favicon", - "favicon.upload": "Upload", + "favicon.upload": "Augšupielādēt", "touch-icon": "Homescreen/Touch Icon", - "touch-icon.upload": "Upload", + "touch-icon.upload": "Augšupielādēt", "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", "outgoing-links": "Outgoing Links", "outgoing-links.warning-page": "Use Outgoing Links Warning Page", diff --git a/public/language/lv/admin/settings/reputation.json b/public/language/lv/admin/settings/reputation.json index bc939e14f0..4e0cca352d 100644 --- a/public/language/lv/admin/settings/reputation.json +++ b/public/language/lv/admin/settings/reputation.json @@ -2,7 +2,7 @@ "reputation": "Ranga punktu sistēma", "disable": "Atspējot ranga punktu sistēmu", "disable-down-voting": "Disable Down Voting", - "votes-are-public": "All Votes Are Public", + "votes-are-public": "Visas balsis ir publiskas", "thresholds": "Activity Thresholds", "min-rep-downvote": "Minimālie ranga punkti, lai balsotu pret ziņām", "min-rep-flag": "Minimālie ranga punkti, lai atzīmēt ziņas", diff --git a/public/language/lv/admin/settings/uploads.json b/public/language/lv/admin/settings/uploads.json index e2963d4a3d..7e96d8d85e 100644 --- a/public/language/lv/admin/settings/uploads.json +++ b/public/language/lv/admin/settings/uploads.json @@ -18,7 +18,7 @@ "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", "default-avatar": "Pielāgotais noklusējuma stilizētais portrets", - "upload": "Upload", + "upload": "Augšupielādēt", "profile-image-dimension": "Profile Image Dimension", "profile-image-dimension-help": "(in pixels, default: 128 pixels)", "max-profile-image-size": "Maximum Profile Image File Size", diff --git a/public/language/lv/category.json b/public/language/lv/category.json index 9c32341096..66b92f2954 100644 --- a/public/language/lv/category.json +++ b/public/language/lv/category.json @@ -9,9 +9,9 @@ "no_new_posts": "Nav jaunu ziņu", "share_this_category": "Dalīties ar šo kategoriju", "watch": "Novērot", - "ignore": "Neievērot", + "ignore": "Ignorēt", "watching": "Novēro", - "ignoring": "Neievēro", + "ignoring": "Ignorē", "watching.description": "Rādīt neizlasitos tematus", "ignoring.description": "Nerādīt neizlasitos tematus", "watch.message": "Tu tagad novēro maiņas šinī kategorijā un visās apakškategorijās", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index ec32147d2d..bcc94a4eca 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -1,7 +1,7 @@ { "invalid-data": "Nederīgi dati", "invalid-json": "Nederīgs JSON", - "not-logged-in": "Šķiet, ka neesi pieteicies.", + "not-logged-in": "Šķiet, ka neesi ielogojies.", "account-locked": "Jūsu konts ir uz laiku bloķēts", "search-requires-login": "Meklēšanai nepieciešams konts - lūdzu, piesakies vai reģistrējies.", "goback": "Nospiedi atpakaļ, lai atgrieztos iepriekšējā lapā", @@ -114,7 +114,7 @@ "invalid-chat-message": "Nederīga saruna", "chat-message-too-long": "Sarunā nevar būt vairāk kā %1 rakstzīmes.", "cant-edit-chat-message": "Tev nav atļauts rediģēt šo ziņu", - "cant-remove-last-user": "Tu nevari izdzēst pēdējo lietotāju", + "cant-remove-last-user": "Tu nevari noņemt pēdējo lietotāju", "cant-delete-chat-message": "Tev nav atļauts izdzēst šo ziņu", "chat-edit-duration-expired": "Pēc publicēšanas Tev ir atļauts tikai %1 sekundes laika rediģēt sarunu", "chat-delete-duration-expired": "Pēc publicēšanas Tev ir atļauts tikai %1 sekundes laika izdzēst sarunu", diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 0e4fb52696..2d1bd6428c 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -45,7 +45,7 @@ "alert.success": "Veiksme", "alert.error": "Kļūda", "alert.banned": "Bloķētie", - "alert.banned.message": "Tu tikko esi bijis bloķēts, Tu tagad izrakstīsies.", + "alert.banned.message": "Tu tikko esi bijis bloķēts, Tu tagad izlogosies.", "alert.unfollow": "Tu vairs neseko %1!", "alert.follow": "Tu tagad seko %1!", "online": "Tiešsaistē", diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 6883e532b6..ccf3032498 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -48,7 +48,7 @@ "account/bookmarks": "%1 atzīmētas ziņas", "account/settings": "Lietotāja iestatījumi", "account/watched": "Temati, kurus %1 novēro", - "account/ignored": "Temati, kurus %1 nenovēro", + "account/ignored": "Temati, kurus %1 ignorē", "account/upvoted": "Ziņas, kurām %1 balsoja par", "account/downvoted": "Ziņas, kurām %1 balsoja pret", "account/best": "%1 labākās ziņas", diff --git a/public/language/lv/search.json b/public/language/lv/search.json index b92935bb50..05bfca032c 100644 --- a/public/language/lv/search.json +++ b/public/language/lv/search.json @@ -1,45 +1,45 @@ { - "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", - "no-matches": "No matches found", + "results_matching": "%1 rezultāts(-i), kas atbilst \"%2\", (%3 sekundes)", + "no-matches": "Sakritības nav atrastas", "advanced-search": "Meklēt izvērsti", - "in": "In", - "titles": "Titles", - "titles-posts": "Titles and Posts", - "match-words": "Match words", - "all": "All", - "any": "Any", - "posted-by": "Posted by", - "in-categories": "In Categories", - "search-child-categories": "Search child categories", + "in": "Kur", + "titles": "Nosaukumos", + "titles-posts": "Nosaukumos un ziņās", + "match-words": "Meklēt vārdus", + "all": "Visi", + "any": "Jebkurš", + "posted-by": "Publicējis", + "in-categories": "Kategorijās", + "search-child-categories": "Meklēt apakškategorijās", "has-tags": "Ir birkas", - "reply-count": "Reply Count", - "at-least": "At least", - "at-most": "At most", - "relevance": "Relevance", - "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", - "any-date": "Any date", - "yesterday": "Yesterday", - "one-week": "One week", - "two-weeks": "Two weeks", - "one-month": "One month", - "three-months": "Three months", - "six-months": "Six months", - "one-year": "One year", - "sort-by": "Sort by", - "last-reply-time": "Last reply time", - "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", - "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", - "descending": "In descending order", - "ascending": "In ascending order", + "reply-count": "Atbilžu skaits", + "at-least": "Vismaz", + "at-most": "Visvairāk", + "relevance": "Atbilstība", + "post-time": "Publicēšanas laiks", + "newer-than": "Jaunāks nekā", + "older-than": "Vecāks nekā", + "any-date": "Jebkurš datums", + "yesterday": "Vakar", + "one-week": "Viena nedēļa", + "two-weeks": "Divas nedēļas", + "one-month": "Viens mēnesis", + "three-months": "Trīs mēneši", + "six-months": "Seši mēneši", + "one-year": "Viens gads", + "sort-by": "Kārtot pēc", + "last-reply-time": "Pēdējās atbildes laiks", + "topic-title": "Temata nosaukums", + "number-of-replies": "Atbilžu skaits", + "number-of-views": "Skati", + "topic-start-date": "Temata sākuma datums", + "username": "Lietotājvārds", + "category": "Kategorija", + "descending": "Dilstošā secībā", + "ascending": "Augošā secībā", "save-preferences": "Saglabāt preferences", - "clear-preferences": "Clear preferences", + "clear-preferences": "Notīrīt preferences", "search-preferences-saved": "Meklēšanas preferences saglabātas", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "search-preferences-cleared": "Meklēšanas preferences notīrītas", + "show-results-as": "Rādīt rezultātus kā" } \ No newline at end of file diff --git a/public/language/lv/success.json b/public/language/lv/success.json index 5345e0a3b9..b636781af5 100644 --- a/public/language/lv/success.json +++ b/public/language/lv/success.json @@ -1,7 +1,7 @@ { - "success": "Success", - "topic-post": "You have successfully posted.", + "success": "Veiksme", + "topic-post": "Veiksmīgi publicēts.", "post-queued": "Tava ziņa ir rindā apstiprināšanai.", - "authentication-successful": "Authentication Successful", + "authentication-successful": "Veiksmīgi autentificējies", "settings-saved": "Iestatījumi saglabāti!" } \ No newline at end of file diff --git a/public/language/lv/tags.json b/public/language/lv/tags.json index bb18904f96..f2084a6590 100644 --- a/public/language/lv/tags.json +++ b/public/language/lv/tags.json @@ -1,7 +1,7 @@ { - "no_tag_topics": "There are no topics with this tag.", + "no_tag_topics": "Nav nevieni temati ar šo birku", "tags": "Birkas", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Ievadi birkas šeit, starp %1 un %2 rakstzīmēm katrai", "enter_tags_here_short": "Ievadi birkas...", "no_tags": "Birku vēl nav" } \ No newline at end of file diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json index c35e404a29..32368a8b05 100644 --- a/public/language/lv/topic.json +++ b/public/language/lv/topic.json @@ -1,38 +1,38 @@ { - "topic": "Topic", - "topic_id": "Topic ID", - "topic_id_placeholder": "Enter topic ID", - "no_topics_found": "No topics found!", - "no_posts_found": "No posts found!", - "post_is_deleted": "This post is deleted!", - "topic_is_deleted": "This topic is deleted!", - "profile": "Profile", - "posted_by": "Posted by %1", - "posted_by_guest": "Posted by Guest", + "topic": "Temats", + "topic_id": "Temata ID", + "topic_id_placeholder": "Ievadīt temata ID", + "no_topics_found": "Nav tematu!", + "no_posts_found": "Nav ziņu!", + "post_is_deleted": "Ziņa izdzēsta!", + "topic_is_deleted": "Temats izdzēsts!", + "profile": "Profils", + "posted_by": "Publicēja %1", + "posted_by_guest": "Publicēja viesis", "chat": "Sarunāties", "notify_me": "Tiec informēts par jaunām atbildēm šajā tematā", - "quote": "Quote", - "reply": "Reply", - "replies_to_this_post": "%1 Replies", - "one_reply_to_this_post": "1 Reply", - "last_reply_time": "Last reply", - "reply-as-topic": "Reply as topic", + "quote": "Citēt", + "reply": "Atbildēt", + "replies_to_this_post": "%1 atbildes", + "one_reply_to_this_post": "1 atbilde", + "last_reply_time": "Pēdējā atbilde", + "reply-as-topic": "Atbildēt kā tematu", "guest-login-reply": "Ielogojies, lai atbildētu", - "edit": "Edit", - "delete": "Delete", - "purge": "Purge", - "restore": "Restore", - "move": "Move", - "fork": "Fork", - "link": "Link", - "share": "Share", - "tools": "Tools", - "locked": "Locked", - "pinned": "Pinned", - "moved": "Moved", - "copy-ip": "Copy IP", + "edit": "Rediģēt", + "delete": "Izdzēst", + "purge": "Iztīrīt", + "restore": "Atjaunot", + "move": "Pārvietot", + "fork": "Nozarot", + "link": "Saistīt", + "share": "Kopīgot", + "tools": "Rīki", + "locked": "Slēgtie", + "pinned": "Piespraustie", + "moved": "Pārvietotie", + "copy-ip": "Kopēt IP adresi", "ban-ip": "Bloķēt IP adresi", - "view-history": "Edit History", + "view-history": "Rediģēšanas vēsture", "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Atzīmēt šo ziņu moderācijai", "merged_message": "This topic has been merged into %2", @@ -48,86 +48,86 @@ "unwatch": "Pārtraukt novērošanu", "watch.title": "Tiec informēts par jaunām atbildēm šajā tematā", "unwatch.title": "Pārtraukt temata novērošanu", - "share_this_post": "Share this Post", + "share_this_post": "Kopīgot ziņu", "watching": "Novēro", "not-watching": "Nenovēro", - "ignoring": "Ignoring", + "ignoring": "Ignorē", "watching.description": "Notify me of new replies.
Show topic in unread.", "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", - "thread_tools.title": "Topic Tools", + "thread_tools.title": "Tematu rīki", "thread_tools.markAsUnreadForAll": "Visiem atzīmēt kā nelasītu", - "thread_tools.pin": "Pin Topic", - "thread_tools.unpin": "Unpin Topic", - "thread_tools.lock": "Lock Topic", - "thread_tools.unlock": "Unlock Topic", - "thread_tools.move": "Move Topic", - "thread_tools.move-posts": "Move Posts", - "thread_tools.move_all": "Move All", - "thread_tools.select_category": "Select Category", - "thread_tools.fork": "Fork Topic", - "thread_tools.delete": "Delete Topic", - "thread_tools.delete-posts": "Delete Posts", - "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", - "thread_tools.restore": "Restore Topic", - "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?", - "post_purge_confirm": "Are you sure you want to purge this post?", - "load_categories": "Loading Categories", - "confirm_move": "Move", - "confirm_fork": "Fork", + "thread_tools.pin": "Piespraust tematu", + "thread_tools.unpin": "Atspraust tematu", + "thread_tools.lock": "Slēgt tematu", + "thread_tools.unlock": "Atslēgt tematu", + "thread_tools.move": "Pārvietot tematu", + "thread_tools.move-posts": "Pārvietot ziņas", + "thread_tools.move_all": "Pārvietot visus", + "thread_tools.select_category": "Atlasīt kategoriju", + "thread_tools.fork": "Nozarot tematu", + "thread_tools.delete": "Izdzēst tematu", + "thread_tools.delete-posts": "Izdzēst ziņas", + "thread_tools.delete_confirm": "Vai tiešām vēlies izdzēst šo tematu?", + "thread_tools.restore": "Atjaunot tematu", + "thread_tools.restore_confirm": "Vai tiešām vēlies atjaunot šo tematu?", + "thread_tools.purge": "Iztīrīt tematu", + "thread_tools.purge_confirm": "Vai tiešām vēlies iztīrīt šo tematu?", + "thread_tools.merge_topics": "Apvienot tematus", + "thread_tools.merge": "Apvienot", + "topic_move_success": "Temats ir veiksmīgi pārvietots uz %1", + "post_delete_confirm": "Vai tiešām vēlies izdzēst šo ziņu?", + "post_restore_confirm": "Vai tiešām vēlies atjaunot šo ziņu?", + "post_purge_confirm": "Vai tiešām vēlies iztīrīt šo ziņu?", + "load_categories": "Ielādē kategorijas", + "confirm_move": "Pārvietot", + "confirm_fork": "Nozarot", "bookmark": "Grāmatzīme", "bookmarks": "Grāmatzīmes", "bookmarks.has_no_bookmarks": "Tu vēl neesi nevienu ziņu atzīmējis ar grāmatzīmi.", - "loading_more_posts": "Loading More Posts", - "move_topic": "Move Topic", - "move_topics": "Move Topics", - "move_post": "Move Post", - "post_moved": "Post moved!", - "fork_topic": "Fork Topic", + "loading_more_posts": "Ielādē vēl ziņas", + "move_topic": "Pārvietot tematu", + "move_topics": "Pārvietot tematus", + "move_post": "Pārvietot ziņu", + "post_moved": "Ziņa pārvietota!", + "fork_topic": "Nozarot tematu", "fork_topic_instruction": "Click the posts you want to fork", "fork_no_pids": "No posts selected!", "fork_pid_count": "%1 post(s) selected", - "fork_success": "Successfully forked topic! Click here to go to the forked topic.", + "fork_success": "Veiksmīgi nozarots temats! Noklikšķini, lai dotos uz nozaroto tematu.", "delete_posts_instruction": "Click the posts you want to delete/purge", "merge_topics_instruction": "Click the topics you want to merge", "move_posts_instruction": "Click the posts you want to move", "composer.title_placeholder": "Enter your topic title here...", - "composer.handle_placeholder": "Name", - "composer.discard": "Discard", - "composer.submit": "Submit", + "composer.handle_placeholder": "Nosaukums", + "composer.discard": "Atmest", + "composer.submit": "Iesniegt", "composer.replying_to": "Replying to %1", "composer.new_topic": "Jauns temats", - "composer.uploading": "uploading...", + "composer.uploading": "augšupielādē...", "composer.thumb_url_label": "Paste a topic thumbnail URL", "composer.thumb_title": "Add a thumbnail to this topic", "composer.thumb_url_placeholder": "http://example.com/thumb.png", - "composer.thumb_file_label": "Or upload a file", - "composer.thumb_remove": "Clear fields", + "composer.thumb_file_label": "Vai augšupielādēt failu", + "composer.thumb_remove": "Notīrīt laukus", "composer.drag_and_drop_images": "Drag and Drop Images Here", "more_users_and_guests": "Vēl %1 lietotājs(-i) un %2 viesi(-s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)", + "more_users": "Vēl %1 lietotājs(-i)", + "more_guests": "Vēl %1 viesis(-i)", "users_and_others": "%1 un %2 citi", - "sort_by": "Sort by", - "oldest_to_newest": "Oldest to Newest", - "newest_to_oldest": "Newest to Oldest", + "sort_by": "Kārtot pēc", + "oldest_to_newest": "No vecākā līdz jaunākajai", + "newest_to_oldest": "No jaunākā līdz vecākajai", "most_votes": "Visvairāk balsu", - "most_posts": "Most Posts", + "most_posts": "Visvairāk ziņu", "stale.title": "Tā vietā izveidot jaunu tematu?", "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", "stale.create": "Izveidot jaunu tematu", "stale.reply_anyway": "Reply to this topic anyway", "link_back": "Re: [%1](%2)", - "diffs.title": "Post Edit History", + "diffs.title": "Ziņas rediģēšanas vēsture", "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision" + "diffs.current-revision": "pašreizējā versija", + "diffs.original-revision": "sākotnējā versija" } \ No newline at end of file diff --git a/public/language/lv/unread.json b/public/language/lv/unread.json index 44db23fb9e..cc14b6742f 100644 --- a/public/language/lv/unread.json +++ b/public/language/lv/unread.json @@ -1,15 +1,15 @@ { "title": "Nelasītie", "no_unread_topics": "Nav nevieni nelasīti temati", - "load_more": "Load More", + "load_more": "Ielādēt vairāk", "mark_as_read": "Atzīmēt kā lasītu", - "selected": "Selected", - "all": "All", - "all_categories": "All categories", + "selected": "Atlasītie", + "all": "Visi", + "all_categories": "Visas kategorijas", "topics_marked_as_read.success": "Temati atzīmēti kā lasīti!", - "all-topics": "All Topics", + "all-topics": "Visi temati", "new-topics": "Jauni temati", "watched-topics": "Novērotie temati", - "unreplied-topics": "Unreplied Topics", - "multiple-categories-selected": "Multiple Selected" + "unreplied-topics": "Temati bez atbildēm", + "multiple-categories-selected": "Vairāki atlasīti" } \ No newline at end of file diff --git a/public/language/lv/uploads.json b/public/language/lv/uploads.json index 651a839876..2efd215ad4 100644 --- a/public/language/lv/uploads.json +++ b/public/language/lv/uploads.json @@ -1,9 +1,9 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb", - "no-uploads-found": "No uploads found", - "public-uploads-info": "Uploads are public, all visitors can see them.", - "private-uploads-info": "Uploads are private, only logged in users can see them." + "uploading-file": "Faila augšupielāde...", + "select-file-to-upload": "Atlasīt augšupielādējamo failu", + "upload-success": "Fails ir veiksmīgi augšupielādēts!", + "maximum-file-size": "Maksimālais izmērs %1 kb", + "no-uploads-found": "Nav augšupielādes", + "public-uploads-info": "Augšupielādes ir publiskas, visi apmeklētāji tās var redzēt.", + "private-uploads-info": "Augšupielādes ir privātas, tikai ielogojušies lietotāji tās var redzēt." } \ No newline at end of file diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 7f7fca9c31..96ee22a664 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -20,13 +20,13 @@ "location": "Location", "age": "Age", "joined": "Joined", - "lastonline": "Last Online", + "lastonline": "Pēdējie tiešsaistē", "profile": "Profile", "profile_views": "Profile views", "reputation": "Ranga punkti", "bookmarks": "Bookmarks", "watched": "Novērotie", - "ignored": "Ignored", + "ignored": "Ignorētie", "followers": "Tie, kuri mani seko", "following": "Tie, kuri es sekoju", "blocks": "Bloķētie", @@ -43,7 +43,7 @@ "follow": "Sekot", "unfollow": "Pārtraukt sekot", "more": "More", - "profile_update_success": "Profile has been updated successfully!", + "profile_update_success": "Profils ir veiksmīgi atjaunināts!", "change_picture": "Mainīt bildi", "change_username": "Mainīt lietotājvārdu", "change_email": "Mainīt e-pasta adresi", @@ -72,7 +72,7 @@ "upload_cover_picture": "Augšupielādēt vāka bildi", "remove_cover_picture_confirm": "Vai tiešām vēlies noņemt vāka bildi?", "crop_picture": "Apgriezt bildi", - "upload_cropped_picture": "Crop and upload", + "upload_cropped_picture": "Apgriezt un augšupielādēt", "settings": "Settings", "show_email": "Rādīt manu e-pasta adresi", "show_fullname": "Rādīt manu vārdu un uzvārdu", @@ -120,7 +120,7 @@ "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", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Rādīt jauno ziņu pēc publicēšanas", "follow_topics_you_reply_to": "Novēro tematus, kuriem esi atbildējis", "follow_topics_you_create": "Novēro tematus, kurus esi izveidojis", "grouptitle": "Group Title", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index bfc64116ba..e987e04184 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -1,21 +1,21 @@ { - "latest_users": "Latest Users", - "top_posters": "Top Posters", + "latest_users": "Jaunākie lietotāji", + "top_posters": "Populārākie publicētāji", "most_reputation": "Visvairāk ranga punktu", "most_flags": "Visvairāk atzīmju", "search": "Meklēt", "enter_username": "Ievadi meklējamo lietotājvārdu", - "load_more": "Load More", + "load_more": "Ielādēt vairāk", "users-found-search-took": "Atrasti %1 lietotājs(-i)! Meklēšana ilga %2 sekundes.", - "filter-by": "Filter By", - "online-only": "Online only", + "filter-by": "Filtrēt pēc", + "online-only": "Tikai tiešsaistē", "invite": "Uzaicināt", "invitation-email-sent": "Uzaicinājuma e-pasta ir nosūtīts %1", - "user_list": "User List", + "user_list": "Lietotāju saraksts", "recent_topics": "Nesenie temati", "popular_topics": "Populārās tēmas", "unread_topics": "Nelasītie temati", - "categories": "Categories", + "categories": "Kategorijas", "tags": "Birkas", - "no-users-found": "No users found!" + "no-users-found": "Nav lietotāju!" } \ No newline at end of file From 2bd02a7ae1056ee2f7e4ba77245c8f72c24405e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 29 Sep 2018 06:45:12 -0400 Subject: [PATCH 235/310] disable timeout on plugin installs --- test/plugins.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/plugins.js b/test/plugins.js index e948cbb160..d10642a2e0 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -116,10 +116,9 @@ describe('Plugins', function () { var latest; var pluginName = 'nodebb-plugin-imgur'; it('should install a plugin', function (done) { - this.timeout(20000); + this.timeout(0); plugins.toggleInstall(pluginName, '1.0.16', function (err, pluginData) { assert.ifError(err); - latest = pluginData.latest; assert.equal(pluginData.name, pluginName); @@ -148,6 +147,7 @@ describe('Plugins', function () { }); it('should upgrade plugin', function (done) { + this.timeout(0); plugins.upgrade(pluginName, 'latest', function (err, isActive) { assert.ifError(err); assert(isActive); @@ -160,6 +160,7 @@ describe('Plugins', function () { }); it('should uninstall a plugin', function (done) { + this.timeout(0); plugins.toggleInstall(pluginName, 'latest', function (err, pluginData) { assert.ifError(err); assert.equal(pluginData.installed, false); From 77beaf2e15f73fc48835aaf477a5c82bfb2bd687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 29 Sep 2018 06:49:41 -0400 Subject: [PATCH 236/310] Allow local login,closes #6800 (#6803) * WIP * reset groups cache after every suite --- install/data/defaults.json | 1 - .../en-GB/admin/manage/privileges.json | 1 + .../language/en-GB/admin/settings/user.json | 1 - src/cli/reset.js | 9 +++- src/controllers/authentication.js | 7 ++- src/controllers/index.js | 43 +++++++++++-------- src/install.js | 5 ++- src/privileges/global.js | 6 +++ src/upgrades/1.10.2/local_login_privileges.js | 17 ++++++++ src/views/admin/settings/user.tpl | 7 --- test/authentication.js | 15 ++++--- test/categories.js | 2 + test/controllers-admin.js | 1 - test/mocks/databasemock.js | 10 ++++- 14 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 src/upgrades/1.10.2/local_login_privileges.js diff --git a/install/data/defaults.json b/install/data/defaults.json index d883742495..ed0ed1e2bf 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -13,7 +13,6 @@ "maximumTagLength": 15, "allowTopicsThumbnail": 0, "registrationType": "normal", - "allowLocalLogin": 1, "allowAccountDelete": 1, "allowFileUploads": 0, "allowedFileExtensions": "png,jpg,bmp", diff --git a/public/language/en-GB/admin/manage/privileges.json b/public/language/en-GB/admin/manage/privileges.json index eddca6d5b6..07d0a4de50 100644 --- a/public/language/en-GB/admin/manage/privileges.json +++ b/public/language/en-GB/admin/manage/privileges.json @@ -10,6 +10,7 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "allow-local-login": "Local Login", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index 664bff67f7..99b6e05a58 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -1,6 +1,5 @@ { "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", diff --git a/src/cli/reset.js b/src/cli/reset.js index 44d78df961..d3675d2ee4 100644 --- a/src/cli/reset.js +++ b/src/cli/reset.js @@ -11,6 +11,7 @@ var events = require('../events'); var meta = require('../meta'); var plugins = require('../plugins'); var widgets = require('../widgets'); +var privileges = require('../privileges'); var dirname = require('./paths').baseDir; @@ -86,9 +87,13 @@ exports.reset = function (options, callback) { }; function resetSettings(callback) { - meta.configs.set('allowLocalLogin', 1, function (err) { + privileges.global.give(['local:login'], 'registered-users', function (err) { + if (err) { + return callback(err); + } + winston.info('[reset] registered-users given login privilege'); winston.info('[reset] Settings reset to default'); - callback(err); + callback(); }); } diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 5dd4d62efe..941ec5bcc9 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -14,7 +14,7 @@ var plugins = require('../plugins'); var utils = require('../utils'); var translator = require('../translator'); var helpers = require('./helpers'); - +var privileges = require('../privileges'); var sockets = require('../socket.io'); var authenticationController = module.exports; @@ -404,6 +404,9 @@ authenticationController.localLogin = function (req, username, password, next) { banned: function (next) { user.isBanned(uid, next); }, + hasLoginPrivilege: function (next) { + privileges.global.can('local:login', uid, next); + }, }, next); }, function (result, next) { @@ -412,7 +415,7 @@ authenticationController.localLogin = function (req, username, password, next) { isAdminOrGlobalMod: result.isAdminOrGlobalMod, }); - if (!result.isAdminOrGlobalMod && parseInt(meta.config.allowLocalLogin, 10) === 0) { + if (parseInt(uid, 10) && !result.hasLoginPrivilege) { return next(new Error('[[error:local-login-disabled]]')); } diff --git a/src/controllers/index.js b/src/controllers/index.js index a91636dfc7..a183692d4e 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -7,6 +7,7 @@ var validator = require('validator'); var meta = require('../meta'); var user = require('../user'); var plugins = require('../plugins'); +var privileges = require('../privileges'); var helpers = require('./helpers'); var Controllers = module.exports; @@ -106,7 +107,6 @@ Controllers.login = function (req, res, next) { data.alternate_logins = loginStrategies.length > 0; data.authentication = loginStrategies; - data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1 || parseInt(req.query.local, 10) === 1; data.allowRegistration = registrationType === 'normal' || registrationType === 'admin-approval' || registrationType === 'admin-approval-ip'; data.allowLoginWith = '[[login:' + allowLoginWith + ']]'; data.breadcrumbs = helpers.buildBreadcrumbs([{ @@ -115,26 +115,33 @@ Controllers.login = function (req, res, next) { data.error = req.flash('error')[0] || errorText; data.title = '[[pages:login]]'; - if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) { - if (res.locals.isAPI) { - return helpers.redirect(res, { - external: nconf.get('relative_path') + data.authentication[0].url, - }); + privileges.global.canGroup('local:login', 'registered-users', function (err, hasLoginPrivilege) { + if (err) { + return next(err); } - return res.redirect(nconf.get('relative_path') + data.authentication[0].url); - } - if (req.loggedIn) { - user.getUserFields(req.uid, ['username', 'email'], function (err, user) { - if (err) { - return next(err); + + data.allowLocalLogin = hasLoginPrivilege || parseInt(req.query.local, 10) === 1; + if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) { + if (res.locals.isAPI) { + return helpers.redirect(res, { + external: nconf.get('relative_path') + data.authentication[0].url, + }); } - data.username = allowLoginWith === 'email' ? user.email : user.username; - data.alternate_logins = false; + return res.redirect(nconf.get('relative_path') + data.authentication[0].url); + } + if (req.loggedIn) { + user.getUserFields(req.uid, ['username', 'email'], function (err, user) { + if (err) { + return next(err); + } + data.username = allowLoginWith === 'email' ? user.email : user.username; + data.alternate_logins = false; + res.render('login', data); + }); + } else { res.render('login', data); - }); - } else { - res.render('login', data); - } + } + }); }; Controllers.register = function (req, res, next) { diff --git a/src/install.js b/src/install.js index cd628b13d9..5ef191cf44 100644 --- a/src/install.js +++ b/src/install.js @@ -381,7 +381,10 @@ function createGlobalModeratorsGroup(next) { function giveGlobalPrivileges(next) { var privileges = require('./privileges'); - var defaultPrivileges = ['chat', 'upload:post:image', 'signature', 'search:content', 'search:users', 'search:tags']; + var defaultPrivileges = [ + 'chat', 'upload:post:image', 'signature', 'search:content', + 'search:users', 'search:tags', 'local:login', + ]; privileges.global.give(defaultPrivileges, 'registered-users', next); } diff --git a/src/privileges/global.js b/src/privileges/global.js index 554adf0bed..5d0cb88213 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -21,6 +21,7 @@ module.exports = function (privileges) { { name: '[[admin/manage/privileges:search-content]]' }, { name: '[[admin/manage/privileges:search-users]]' }, { name: '[[admin/manage/privileges:search-tags]]' }, + { name: '[[admin/manage/privileges:allow-local-login]]' }, ]; privileges.global.userPrivilegeList = [ @@ -32,6 +33,7 @@ module.exports = function (privileges) { 'search:content', 'search:users', 'search:tags', + 'local:login', ]; privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(function (privilege) { @@ -111,6 +113,10 @@ module.exports = function (privileges) { ], callback); }; + privileges.global.canGroup = function (privilege, groupName, callback) { + groups.isMember(groupName, 'cid:0:privileges:groups:' + privilege, callback); + }; + privileges.global.give = function (privileges, groupName, callback) { helpers.giveOrRescind(groups.join, privileges, 0, groupName, callback); }; diff --git a/src/upgrades/1.10.2/local_login_privileges.js b/src/upgrades/1.10.2/local_login_privileges.js new file mode 100644 index 0000000000..005d74afac --- /dev/null +++ b/src/upgrades/1.10.2/local_login_privileges.js @@ -0,0 +1,17 @@ +'use strict'; + +module.exports = { + name: 'Give global local login privileges', + timestamp: Date.UTC(2018, 8, 28), + method: function (callback) { + var meta = require('../../meta'); + var privileges = require('../../privileges'); + var allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1; + + if (allowLocalLogin) { + privileges.global.give(['local:login'], 'registered-users', callback); + } else { + callback(); + } + }, +}; diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index 5b1a003068..415c516477 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -4,13 +4,6 @@
[[admin/settings/user:authentication]]
-
- -
-