Add some i18n function calls to controllers for add*, update the models and make controllers destructure res.locals for less repetition of res.locals, and add more machine russian translation

indiachan-spamvector
Thomas Lynch 1 year ago
parent 426bf4c4b3
commit 3f3e63f9c1
  1. 9
      controllers/forms/addassets.js
  2. 21
      controllers/forms/addcustompage.js
  3. 9
      controllers/forms/addflags.js
  4. 11
      controllers/forms/addnews.js
  5. 14
      controllers/forms/addstaff.js
  6. 18
      locales/en.json
  7. 18
      locales/pt.json
  8. 30
      locales/ru.json
  9. 17
      models/forms/addassets.js
  10. 5
      models/forms/addcustompage.js
  11. 13
      models/forms/addflags.js
  12. 5
      models/forms/addnews.js
  13. 6
      models/forms/addstaff.js
  14. 5
      models/forms/banposter.js
  15. 5
      models/forms/blockbypass.js
  16. 21
      models/forms/uploadbanners.js

@ -12,18 +12,19 @@ module.exports = {
controller: async (req, res, next) => {
const { __ } = res.locals;
const { globalLimits } = config.get;
const errors = await checkSchema([
{ result: res.locals.numFiles === 0, expected: false, blocking: true, error: 'Must provide a file' },
{ result: numberBody(res.locals.numFiles, 0, globalLimits.assetFiles.max), expected: true, error: `Exceeded max asset uploads in one request of ${globalLimits.assetFiles.max}` },
{ result: numberBody(res.locals.board.assets.length+res.locals.numFiles, 0, globalLimits.assetFiles.max), expected: true, error: `Total number of assets would exceed global limit of ${globalLimits.assetFiles.total}` },
{ result: res.locals.numFiles === 0, expected: false, blocking: true, error: __('Must provide a file') },
{ result: numberBody(res.locals.numFiles, 0, globalLimits.assetFiles.max), expected: true, error: __('Exceeded max asset uploads in one request of %s', globalLimits.assetFiles.max) },
{ result: numberBody(res.locals.board.assets.length+res.locals.numFiles, 0, globalLimits.assetFiles.max), expected: true, error: __('Total number of assets would exceed global limit of %s', globalLimits.assetFiles.total) },
]);
if (errors.length > 0) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'title': __('Bad request'),
'errors': errors,
'redirect': `/${req.params.board}/manage/assets.html`
});

@ -16,32 +16,33 @@ module.exports = {
controller: async (req, res, next) => {
const { __ } = res.locals;
const { globalLimits } = config.get;
const errors = await checkSchema([
{ result: existsBody(req.body.message), expected: true, error: 'Missing message' },
{ result: existsBody(req.body.title), expected: true, error: 'Missing title' },
{ result: existsBody(req.body.page), expected: true, error: 'Missing .html name' },
{ result: existsBody(req.body.message), expected: true, error: __('Missing message') },
{ result: existsBody(req.body.title), expected: true, error: __('Missing title' ) },
{ result: existsBody(req.body.page), expected: true, error: __('Missing .html name') },
{ result: () => {
if (req.body.page) {
return /^[a-z0-9_-]+$/i.test(req.body.page);
}
return false;
} , expected: true, error: '.html name must contain a-z 0-9 _ - only' },
{ result: numberBody(res.locals.messageLength, 0, globalLimits.customPages.maxLength), expected: true, error: `Message must be ${globalLimits.customPages.maxLength} characters or less` },
{ result: lengthBody(req.body.title, 0, 50), expected: false, error: 'Title must be 50 characters or less' },
{ result: lengthBody(req.body.page, 0, 50), expected: false, error: '.html name must be 50 characters or less' },
} , expected: true, error: __('.html name must contain a-z 0-9 _ - only') },
{ result: numberBody(res.locals.messageLength, 0, globalLimits.customPages.maxLength), expected: true, error: __('Message must be %s characters or less', globalLimits.customPages.maxLength) },
{ result: lengthBody(req.body.title, 0, 50), expected: false, error: __('Title must be 50 characters or less') },
{ result: lengthBody(req.body.page, 0, 50), expected: false, error: __('.html name must be 50 characters or less') },
{ result: async () => {
return (await CustomPages.boardCount(req.params.board)) > globalLimits.customPages.max;
}, expected: false, error: `Can only create ${globalLimits.customPages.max} pages per board`},
}, expected: false, error: __('Can only create %s pages per board', globalLimits.customPages.max) },
{ result: async () => {
return (await CustomPages.findOne(req.params.board, req.body.page)) == null;
}, expected: true, error: '.html name must be unique'},
}, expected: true, error: __('.html name must be unique') },
]);
if (errors.length > 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'title': __('Bad request'),
'errors': errors,
'redirect': `/${req.params.booard}/manage/custompages.html`
});

@ -12,18 +12,19 @@ module.exports = {
controller: async (req, res, next) => {
const { __ } = res.locals;
const { globalLimits } = config.get;
const errors = await checkSchema([
{ result: res.locals.numFiles === 0, expected: false, blocking: true, error: 'Must provide a file' },
{ result: numberBody(res.locals.numFiles, 0, globalLimits.flagFiles.max), expected: true, error: `Exceeded max flag uploads in one request of ${globalLimits.flagFiles.max}` },
{ result: numberBody(Object.keys(res.locals.board.flags).length+res.locals.numFiles, 0, globalLimits.flagFiles.max), expected: true, error: `Total number of flags would exceed global limit of ${globalLimits.flagFiles.total}` },
{ result: res.locals.numFiles === 0, expected: false, blocking: true, error: __('Must provide a file') },
{ result: numberBody(res.locals.numFiles, 0, globalLimits.flagFiles.max), expected: true, error: __('Exceeded max flag uploads in one request of %s', globalLimits.flagFiles.max) },
{ result: numberBody(Object.keys(res.locals.board.flags).length+res.locals.numFiles, 0, globalLimits.flagFiles.max), expected: true, error: __('Total number of flags would exceed global limit of %s', globalLimits.flagFiles.total) },
]);
if (errors.length > 0) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'title': __('Bad request'),
'errors': errors,
'redirect': `/${req.params.board}/manage/assets.html`
});

@ -15,18 +15,19 @@ module.exports = {
controller: async (req, res, next) => {
const { __ } = res.locals;
const { globalLimits } = config.get;
const errors = await checkSchema([
{ result: existsBody(req.body.message), expected: true, error: 'Missing message' },
{ result: existsBody(req.body.title), expected: true, error: 'Missing title' },
{ result: numberBody(res.locals.messageLength, 0, globalLimits.fieldLength.message), expected: true, error: `Message must be ${globalLimits.fieldLength.message} characters or less` },
{ result: lengthBody(req.body.title, 0, 50), expected: false, error: 'Title must be 50 characters or less' },
{ result: existsBody(req.body.message), expected: true, error: __('Missing message') },
{ result: existsBody(req.body.title), expected: true, error: __('Missing title') },
{ result: numberBody(res.locals.messageLength, 0, globalLimits.fieldLength.message), expected: true, error: __('Message must be %s characters or less', globalLimits.fieldLength.message) },
{ result: lengthBody(req.body.title, 0, 50), expected: false, error: __('Title must be 50 characters or less') },
]);
if (errors.length > 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'title': __('Bad request'),
'errors': errors,
'redirect': '/globalmanage/news.html'
});

@ -14,20 +14,22 @@ module.exports = {
controller: async (req, res, next) => {
const { __ } = res.locals;
const errors = await checkSchema([
{ result: existsBody(req.body.username), expected: true, error: 'Missing staff username' },
{ result: lengthBody(req.body.username, 0, 50), expected: false, error: 'Username must be 50 characters or less' },
{ result: (res.locals.board.owner === req.body.username), expected: false, blocking: true, error: 'User is already board owner' },
{ result: (res.locals.board.staff[req.body.username] != null), expected: false, blocking: true, error: 'User is already staff' },
{ result: existsBody(req.body.username), expected: true, error: __('Missing staff username') },
{ result: lengthBody(req.body.username, 0, 50), expected: false, error: __('Username must be 50 characters or less') },
{ result: (res.locals.board.owner === req.body.username), expected: false, blocking: true, error: __('User is already board owner') },
{ result: (res.locals.board.staff[req.body.username] != null), expected: false, blocking: true, error: __('User is already staff') },
{ result: async () => {
const numAccounts = await Accounts.countUsers([req.body.username]);
return numAccounts > 0;
}, expected: true, error: 'User does not exist' },
}, expected: true, error: __('User does not exist') },
]);
if (errors.length > 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'title': __('Bad request'),
'errors': errors,
'redirect': req.headers.referer || `/${req.params.board}/manage/staff.html`,
});

@ -1,5 +1,8 @@
{
".html name": ".html name",
".html name must be 50 characters or less": ".html name must be 50 characters or less",
".html name must be unique": ".html name must be unique",
".html name must contain a-z 0-9 _ - only": ".html name must contain a-z 0-9 _ - only",
"(You)": "(You)",
"(You)s": "(You)s",
"%s characters": {
@ -193,6 +196,7 @@
"Bypass the basic anti-flood spamcheck for too frequent similar posting.": "Bypass the basic anti-flood spamcheck for too frequent similar posting.",
"Bypasses": "Bypasses",
"Cache": "Cache",
"Can only create %s pages per board": "Can only create %s pages per board",
"Canvas height in pixels": "Canvas height in pixels",
"Canvas width in pixels": "Canvas width in pixels",
"Captcha config error": "Captcha config error",
@ -286,6 +290,8 @@
"Error reconnecting": "Error reconnecting",
"Europe": "Tor Exit Node",
"Events": "Events",
"Exceeded max asset uploads in one request of %s": "Exceeded max asset uploads in one request of %s",
"Exceeded max flag uploads in one request of %s": "Exceeded max flag uploads in one request of %s",
"Existing Password": "Existing Password",
"Expires": "Expires",
"Expiry": "Expiry",
@ -418,8 +424,13 @@
"Merge layers": "Merge layers",
"Merge selected layers?": "Merge selected layers?",
"Message": "Message",
"Message must be %s characters or less": "Message must be %s characters or less",
"Mime type mismatch for file \"%s\"": "Mime type mismatch for file \"%s\"",
"Missing .html name": "Missing .html name",
"Missing file extensions": "Missing file extensions",
"Missing message": "Missing message",
"Missing staff username": "Missing staff username",
"Missing title": "Missing title",
"Mod Catalog": "Mod Catalog",
"Mod Index": "Mod Index",
"Mod View": "Mod View",
@ -428,6 +439,7 @@
"Move": "Move",
"Move down": "Move down",
"Move up": "Move up",
"Must provide a file": "Must provide a file",
"My permissions": "My permissions",
"My Permissions": "My Permissions",
"Name": "Name",
@ -601,6 +613,7 @@
"Thread Watcher": "Thread Watcher",
"Tip": "Tip",
"Title": "Title",
"Title must be 50 characters or less": "Title must be 50 characters or less",
"Toggle Bumplock": "Toggle Bumplock",
"Toggle Cycle": "Toggle Cycle",
"Toggle Lock": "Toggle Lock",
@ -609,6 +622,7 @@
"Too many files": "Too many files",
"Tor Hidden Service": "Tor Hidden Service",
"total": "total",
"Total number of flags would exceed global limit of %s": "Total number of flags would exceed global limit of %s",
"Two Factor Authentication Setup": "Two Factor Authentication Setup",
"Type": "Type",
"Unban": "Unban",
@ -648,8 +662,12 @@
"Use strikethrough": "Use strikethrough",
"Use titles": "Use titles",
"Use underline": "Use underline",
"User does not exist": "User does not exist",
"User is already board owner": "User is already board owner",
"User is already staff": "User is already staff",
"USER WAS BANNED FOR THIS POST": "USER WAS BANNED FOR THIS POST",
"Username": "Username",
"Username must be 50 characters or less": "Username must be 50 characters or less",
"Users": "Users",
"Value": "Value",
"Video/Audio volume": "Video/Audio volume",

@ -1,5 +1,8 @@
{
".html name": ".html nome",
".html name must be 50 characters or less": ".html name must be 50 characters or less",
".html name must be unique": ".html name must be unique",
".html name must contain a-z 0-9 _ - only": ".html name must contain a-z 0-9 _ - only",
"(You)": "(You)",
"(You)s": "(You)s",
"%s characters": {
@ -193,6 +196,7 @@
"Bypass the basic anti-flood spamcheck for too frequent similar posting.": "Bypass the basic anti-flood spamcheck for too frequent similar posting.",
"Bypasses": "Bypasses",
"Cache": "Cache",
"Can only create %s pages per board": "Can only create %s pages per board",
"Canvas height in pixels": "Altura da tela em pixeis",
"Canvas width in pixels": "Largura da tela em pixeis",
"Captcha config error": "Captcha config error",
@ -286,6 +290,8 @@
"Error reconnecting": "Erro a ligar",
"Europe": "Tor Exit Node",
"Events": "Eventos",
"Exceeded max asset uploads in one request of %s": "Exceeded max asset uploads in one request of %s",
"Exceeded max flag uploads in one request of %s": "Exceeded max flag uploads in one request of %s",
"Existing Password": "Existing Password",
"Expires": "Expira",
"Expiry": "Expira",
@ -418,8 +424,13 @@
"Merge layers": "Fundir camadas",
"Merge selected layers?": "Fundir camadas selecionadas?",
"Message": "Mensagem",
"Message must be %s characters or less": "Message must be %s characters or less",
"Mime type mismatch for file \"%s\"": "Mime type mismatch for file \"%s\"",
"Missing .html name": "Missing .html name",
"Missing file extensions": "Missing file extensions",
"Missing message": "Missing message",
"Missing staff username": "Missing staff username",
"Missing title": "Missing title",
"Mod Catalog": "Mod Catálogo",
"Mod Index": "Mod Index",
"Mod View": "Mod View",
@ -428,6 +439,7 @@
"Move": "Move",
"Move down": "Mover para baixo",
"Move up": "Mover para cima",
"Must provide a file": "Must provide a file",
"My permissions": "Minhas permissões",
"My Permissions": "Minhas Permissões",
"Name": "Nome",
@ -601,6 +613,7 @@
"Thread Watcher": "Favoritos",
"Tip": "Ponta",
"Title": "Title",
"Title must be 50 characters or less": "Title must be 50 characters or less",
"Toggle Bumplock": "Toggle Bumplock",
"Toggle Cycle": "Toggle Cycle",
"Toggle Lock": "Trancar",
@ -609,6 +622,7 @@
"Too many files": "Too many files",
"Tor Hidden Service": "Tor Hidden Service",
"total": "total",
"Total number of flags would exceed global limit of %s": "Total number of flags would exceed global limit of %s",
"Two Factor Authentication Setup": "Configuração 2FA",
"Type": "Tipo",
"Unban": "Remover Ban",
@ -648,8 +662,12 @@
"Use strikethrough": "Use strikethrough",
"Use titles": "Use titles",
"Use underline": "Use underline",
"User does not exist": "User does not exist",
"User is already board owner": "User is already board owner",
"User is already staff": "User is already staff",
"USER WAS BANNED FOR THIS POST": "UTILIZADOR FOI BANIDO",
"Username": "Username",
"Username must be 50 characters or less": "Username must be 50 characters or less",
"Users": "Utilizadores",
"Value": "Valor",
"Video/Audio volume": "Volume vídeo/áudio",

@ -1,5 +1,8 @@
{
".html name": ".html name",
".html name must be 50 characters or less": ".html-имя должно содержать не более 50 символов",
".html name must be unique": ".html-имя должно быть уникальным",
".html name must contain a-z 0-9 _ - only": ".html-имя должно содержать только a-z 0-9 _ -",
"(You)": "(Вы)",
"(You)s": "(Вы) s",
"%s characters": {
@ -104,18 +107,18 @@
"Active Sessions": "Активные сеансы.",
"Add": "Добавить",
"Add Asset (Max %s)": {
"one": "Добавить активы (макс. %с)",
"other": "Добавить активы (макс. %с)"
"one": "Добавить активы (макс. %s)",
"other": "Добавить активы (макс. %s)"
},
"Add Banner (Max %s)": {
"one": "Добавить баннер (макс. %с)",
"other": "Добавить баннеры (макс. %с)"
"one": "Добавить баннер (макс. %s)",
"other": "Добавить баннеры (макс. %s)"
},
"Add Boards": "Добавить доски объявлений",
"Add Custom Page": "Добавить пользовательскую страницу",
"Add Flag (Max %s)": {
"one": "Добавить флаг (макс. %с)",
"other": "Добавить флаги (макс. %с)"
"one": "Добавить флаг (макс. %s)",
"other": "Добавить флаги (макс. %s)"
},
"Add layer": "Добавить слой",
"Add News": "Добавить новости",
@ -193,6 +196,7 @@
"Bypass the basic anti-flood spamcheck for too frequent similar posting.": "Обойти базовую проверку на спам против флуда при слишком частых похожих публикациях.",
"Bypasses": "Обходит",
"Cache": "Кэш",
"Can only create %s pages per board": "Может создавать только %s страниц на доску",
"Canvas height in pixels": "Высота холста в пикселях",
"Canvas width in pixels": "Ширина холста в пикселях",
"Captcha config error": "Ошибка конфигурации Captcha",
@ -286,6 +290,8 @@
"Error reconnecting": "Ошибка повторного подключения",
"Europe": "Узел выхода из Tor",
"Events": "События",
"Exceeded max asset uploads in one request of %s": "Превышено максимальное количество загрузок активов за один запрос в %s",
"Exceeded max flag uploads in one request of %s": "Превышено максимальное количество загрузок файлов за один запрос на %s",
"Existing Password": "Существующий пароль",
"Expires": "Истекает",
"Expiry": "Истечение срока действия",
@ -418,8 +424,13 @@
"Merge layers": "Объединить слои",
"Merge selected layers?": "Объединить выбранные слои?",
"Message": "Сообщение",
"Message must be %s characters or less": "Сообщение должно содержать не более символов %s",
"Mime type mismatch for file \"%s\"": "Несоответствие типа Mime для файла \"%s\"",
"Missing .html name": "Отсутствует имя .html",
"Missing file extensions": "Отсутствующие расширения файлов",
"Missing message": "Пропущенное сообщение",
"Missing staff username": "Отсутствующее имя пользователя сотрудника",
"Missing title": "Отсутствующий заголовок",
"Mod Catalog": "Каталог модов",
"Mod Index": "Индекс модов",
"Mod View": "Вид модов",
@ -428,6 +439,7 @@
"Move": "Переместить",
"Move down": "Переместить вниз",
"Move up": "Переместить вверх",
"Must provide a file": "Необходимо предоставить файл",
"My permissions": "Мои разрешения",
"My Permissions": "Мои разрешения.",
"Name": "Имя",
@ -601,6 +613,7 @@
"Thread Watcher": "Наблюдатель за нитью.",
"Tip": "Наконечник",
"Title": "Заголовок",
"Title must be 50 characters or less": "Заголовок должен содержать не более 50 символов",
"Toggle Bumplock": "Переключить блокировку",
"Toggle Cycle": "Переключить цикл",
"Toggle Lock": "Переключить блокировку.",
@ -609,6 +622,7 @@
"Too many files": "Слишком много файлов",
"Tor Hidden Service": "Скрытая служба Tor",
"total": "всего",
"Total number of flags would exceed global limit of %s": "Общее количество флагов превысило бы глобальный предел в %s",
"Two Factor Authentication Setup": "Двухфакторная Настройка аутентификации",
"Type": "Тип",
"Unban": "Отменить запрет",
@ -648,8 +662,12 @@
"Use strikethrough": "Использовать зачеркивание",
"Use titles": "Использовать заголовки",
"Use underline": "Использовать подчеркивание",
"User does not exist": "Пользователь не существует",
"User is already board owner": "Пользователь уже является владельцем доски",
"User is already staff": "Пользователь уже является сотрудником",
"USER WAS BANNED FOR THIS POST": "ПОЛЬЗОВАТЕЛЬ БЫЛ ЗАБАНЕН ЗА ЭТОТ ПОСТ",
"Username": "Имя пользователя",
"Username must be 50 characters or less": "Имя пользователя должно содержать не более 50 символов",
"Users": "Пользователи",
"Value": "Значение",
"Video/Audio volume": "Громкость видео / аудио",

@ -11,6 +11,7 @@ const { remove, pathExists } = require('fs-extra')
module.exports = async (req, res) => {
const { __, __n } = res.locals;
const { checkRealMimeTypes } = config.get;
const redirect = `/${req.params.board}/manage/assets.html`;
@ -24,8 +25,8 @@ module.exports = async (req, res) => {
})) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'title': __('Bad request'),
'message': __('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'redirect': redirect
});
}
@ -34,8 +35,8 @@ module.exports = async (req, res) => {
if (!(await mimeTypes.realMimeCheck(req.files.file[i]))) {
deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Mime type mismatch for file "%s"', req.files.file[i].name),
'title': __('Bad request'),
'message': __('Mime type mismatch for file "%s"', req.files.file[i].name),
'redirect': redirect
});
}
@ -71,8 +72,8 @@ module.exports = async (req, res) => {
// no new assets
if (filenames.length === 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__n('Asset already exist', res.locals.numFiles),
'title': __('Bad request'),
'message': __n('Asset already exist', res.locals.numFiles),
'redirect': redirect
});
}
@ -84,8 +85,8 @@ module.exports = async (req, res) => {
res.locals.board.assets = res.locals.board.assets.concat(filenames);
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__n('Uploaded %s new assets.', filenames.length),
'title': __('Success'),
'message': __n('Uploaded %s new assets.', filenames.length),
'redirect': redirect
});

@ -8,6 +8,7 @@ const { CustomPages } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
const message = prepareMarkdown(req.body.message, false);
const { message: markdownMessage } = await messageHandler(message, null, null, res.locals.permissions);
@ -36,8 +37,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__('Added custom page'),
'title': __('Success'),
'message': __('Added custom page'),
'redirect': `/${req.params.board}/manage/custompages.html`
});

@ -14,6 +14,7 @@ const path = require('path')
module.exports = async (req, res) => {
const { __ } = res.locals;
const { checkRealMimeTypes } = config.get;
const redirect = `/${req.params.board}/manage/assets.html`;
@ -28,8 +29,8 @@ module.exports = async (req, res) => {
})) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'title': __('Bad request'),
'message': __('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'redirect': redirect
});
}
@ -41,8 +42,8 @@ module.exports = async (req, res) => {
if (!(await mimeTypes.realMimeCheck(req.files.file[i]))) {
deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Mime type mismatch for file "%s"', req.files.file[i].name),
'title': __('Bad request'),
'message': __('Mime type mismatch for file "%s"', req.files.file[i].name),
'redirect': redirect
});
}
@ -95,8 +96,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__('Uploaded %s new flags.', res.locals.numFiles),
'title': __('Success'),
'message': __('Uploaded %s new flags.', res.locals.numFiles),
'redirect': redirect
});

@ -8,6 +8,7 @@ const { News } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
const message = prepareMarkdown(req.body.message, false);
const { message: markdownNews } = await messageHandler(message, null, null, res.locals.permissions);
@ -29,8 +30,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__('Added newspost'),
'title': __('Success'),
'message': __('Added newspost'),
'redirect': '/globalmanage/news.html'
});

@ -6,14 +6,16 @@ const { Boards, Accounts } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
await Promise.all([
Accounts.addStaffBoard([req.body.username], res.locals.board._id),
Boards.addStaff(res.locals.board._id, req.body.username, roleManager.roles.BOARD_STAFF)
]);
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__('Added staff'),
'title': __('Success'),
'message': __('Added staff'),
'redirect': `/${req.params.board}/manage/staff.html`,
});

@ -5,10 +5,11 @@ const { Bans } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __, __n } = res.locals;
const { defaultBanDuration } = config.get;
const banDate = new Date();
const banExpiry = new Date(banDate.getTime() + (req.body.ban_duration || defaultBanDuration)); //uses config default if missing or malformed
const banReason = req.body.ban_reason || req.body.log_message || res.locals.__('No reason specified');
const banReason = req.body.ban_reason || req.body.log_message || __('No reason specified');
const allowAppeal = (req.body.no_appeal || req.body.ban_q || req.body.ban_h) ? false : true; //dont allow appeals for range bans
const bans = [];
@ -105,7 +106,7 @@ module.exports = async (req, res) => {
const numBans = await Bans.insertMany(bans).then(result => result.insertedCount);
const query = {
message: res.locals.__n('Added %s bans', numBans),
message: __n('Added %s bans', numBans),
};
if ((req.body.ban || req.body.global_ban ) && req.body.ban_reason) {

@ -7,6 +7,7 @@ const { Bypass } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
const { secureCookies, blockBypass } = config.get;
const existingBypassId = req.signedCookies.bypassid || res.locals.pseudoIp;
const bypass = await Bypass.getBypass(res.locals.anonymizer, existingBypassId, blockBypass.expireAfterUses);
@ -22,8 +23,8 @@ module.exports = async (req, res) => {
return dynamicResponse(req, res, 200, 'message', {
'minimal': req.body.minimal,
'title': res.locals.__('Success'),
'message': res.locals.__('Completed block bypass, you may go back and make your post.'),
'title': __('Success'),
'message': __('Completed block bypass, you may go back and make your post.'),
});
};

@ -13,6 +13,7 @@ const { remove, pathExists } = require('fs-extra')
module.exports = async (req, res) => {
const { __, __n } = res.locals;
const { globalLimits, checkRealMimeTypes } = config.get;
const redirect = `/${req.params.board}/manage/assets.html`;
@ -27,8 +28,8 @@ module.exports = async (req, res) => {
})) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'title': __('Bad request'),
'message': __('Invalid file type for %s. Mimetype %s not allowed.', req.files.file[i].name, req.files.file[i].mimetype),
'redirect': redirect
});
}
@ -38,8 +39,8 @@ module.exports = async (req, res) => {
if (!(await mimeTypes.realMimeCheck(req.files.file[i]))) {
deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__('Mime type mismatch for file "%s"', req.files.file[i].name),
'title': __('Bad request'),
'message': __('Mime type mismatch for file "%s"', req.files.file[i].name),
'redirect': redirect
});
}
@ -57,8 +58,8 @@ module.exports = async (req, res) => {
&& (geometry.width/geometry.height !== 3))) {
await deleteTempFiles(req).catch(console.error);
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__(`Invalid file "%s". Max banner dimensions are %sx%s${globalLimits.bannerFiles.forceAspectRatio === true ? ' and must be a 3:1 aspect ratio' : '' }.`, req.files.file[i].name, globalLimits.bannerFiles.width, globalLimits.bannerFiles.height),
'title': __('Bad request'),
'message': __(`Invalid file "%s". Max banner dimensions are %sx%s${globalLimits.bannerFiles.forceAspectRatio === true ? ' and must be a 3:1 aspect ratio' : '' }.`, req.files.file[i].name, globalLimits.bannerFiles.width, globalLimits.bannerFiles.height),
'redirect': redirect
});
}
@ -93,8 +94,8 @@ module.exports = async (req, res) => {
// no new banners
if (filenames.length === 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': res.locals.__('Bad request'),
'message': res.locals.__n('Banner already exist', res.locals.numFiles),
'title': __('Bad request'),
'message': __n('Banner already exist', res.locals.numFiles),
'redirect': redirect
});
}
@ -116,8 +117,8 @@ module.exports = async (req, res) => {
}
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': res.locals.__n('Uploaded %s new banners.', filenames.length),
'title': __('Success'),
'message': __n('Uploaded %s new banners.', filenames.length),
'redirect': redirect
});

Loading…
Cancel
Save