Translate a bunch more actionhandlers and form models, and imrpove error translations in server.js ref #396

merge-requests/341/head
Thomas Lynch 1 year ago
parent c75519503f
commit 48bf19a3d3
  1. 3
      controllers/pages.js
  2. 36
      locales/en.json
  3. 36
      locales/pt.json
  4. 36
      locales/ru.json
  5. 4
      models/forms/actionhandler.js
  6. 5
      models/forms/deleteaccounts.js
  7. 5
      models/forms/deleteassets.js
  8. 5
      models/forms/deletebanners.js
  9. 5
      models/forms/deletecustompage.js
  10. 5
      models/forms/deleteflags.js
  11. 6
      models/forms/deletenews.js
  12. 9
      models/forms/deletepostsfiles.js
  13. 5
      models/forms/deletestaff.js
  14. 8
      models/forms/dismissglobalreport.js
  15. 8
      models/forms/dismissreport.js
  16. 8
      server.js
  17. 2
      views/pages/error.pug

@ -83,7 +83,7 @@ router.get('/:board/manage/custompages.html', useSession, sessionRefresh, isLogg
hasPerms.one(Permissions.MANAGE_BOARD_CUSTOMISATION), csrf, manageCustomPages);
router.get('/:board/manage/editcustompage/:custompageid([a-f0-9]{24}).html', useSession, sessionRefresh, isLoggedIn, Boards.exists, setBoardLanguage, calcPerms,
hasPerms.one(Permissions.MANAGE_BOARD_CUSTOMISATION), csrf, custompageParamConverter, editCustomPage);
router.get('/:board/manage/staff.html', useSession, sessionRefresh, isLoggedIn, Boards.exists, calcPerms,
router.get('/:board/manage/staff.html', useSession, sessionRefresh, isLoggedIn, Boards.exists, setBoardLanguage, calcPerms,
hasPerms.one(Permissions.MANAGE_BOARD_STAFF), csrf, manageStaff);
router.get('/:board/manage/editstaff/:staffusername([a-zA-Z0-9]{1,50}).html', useSession, sessionRefresh, isLoggedIn, Boards.exists, setBoardLanguage, calcPerms,
hasPerms.one(Permissions.MANAGE_BOARD_STAFF), csrf, editStaff);
@ -113,7 +113,6 @@ router.get('/globalmanage/editaccount/:accountusername([a-zA-Z0-9]{1,50}).html',
hasPerms.one(Permissions.MANAGE_GLOBAL_ACCOUNTS), csrf, editAccount);
router.get('/globalmanage/editrole/:roleid([a-f0-9]{24}).html', useSession, sessionRefresh, isLoggedIn, calcPerms,
hasPerms.one(Permissions.MANAGE_GLOBAL_ROLES), csrf, roleParamConverter, editRole);
//TODO: edit post edit page form, like editnews/editaccount/editrole endpoint
//captcha
router.get('/captcha', geoIp, processIp, captcha); //get captcha image and cookie

@ -261,6 +261,7 @@
"Change Password": "Change Password",
"Clear": "Clear",
"Click here if you are not redirected automatically.": "Click here if you are not redirected automatically.",
"Client aborted request": "Client aborted request",
"Close": "Close",
"Code Block": "Code Block",
"Code Highlight Language Detect Threshold": "Code Highlight Language Detect Threshold",
@ -321,6 +322,28 @@
"Delete Selected": "Delete Selected",
"Delete selected layers?": "Delete selected layers?",
"Delete your account": "Delete your account",
"Deleted %s accounts": {
"one": "Deleted %s account",
"other": "Deleted %s accounts"
},
"Deleted %s assets": {
"one": "Deleted %s asset",
"other": "Deleted %s assets"
},
"Deleted %s banners": {
"one": "Deleted %s banner",
"other": "Deleted %s banners"
},
"Deleted %s custom pages": {
"one": "Deleted %s custom page",
"other": "Deleted %s custom pages"
},
"Deleted %s files from server": {
"one": "Deleted %s file from server",
"other": "Deleted %s files from server"
},
"Deleted flags": "Deleted flags",
"Deleted news": "Deleted news",
"Deny Appeal": "Deny Appeal",
"Descending": "Descending",
"Description": "Description",
@ -333,6 +356,7 @@
"Disconnected": "Disconnected",
"Dismiss Global Reports": "Dismiss Global Reports",
"Dismiss Reports": "Dismiss Reports",
"Dismissed reports": "Dismissed reports",
"Distortion Intensity": "Distortion Intensity",
"DNSBL": "DNSBL",
"DNSBL Addresses": "DNSBL Addresses",
@ -515,12 +539,14 @@
"Index": "Index",
"Index View": "Index View",
"Inline Monospace": "Inline Monospace",
"Internal server error": "Internal server error",
"Internal Server Error": "Internal Server Error",
"Invalid CSRF token": "Invalid CSRF token",
"Invalid dimensions.": "Invalid dimensions.",
"Invalid file \"%s\". Max banner dimensions are %sx%s and must be a 3:1 aspect ratio.": "Invalid file \"%s\". Max banner dimensions are %sx%s and must be a 3:1 aspect ratio.",
"Invalid file \"%s\". Max banner dimensions are %sx%s.": "Invalid file \"%s\". Max banner dimensions are %sx%s.",
"Invalid file type for %s. Mimetype %s not allowed.": "Invalid file type for %s. Mimetype %s not allowed.",
"Invalid or missing \"Referer\" header. Are you posting from the correct URL?": "Invalid or missing \"Referer\" header. Are you posting from the correct URL?",
"Invalid request body": "Invalid request body",
"IP": "IP",
"IP Header": "IP Header",
"IP/Hash": "IP/Hash",
@ -632,12 +658,14 @@
"No camera? Use this secret in your authenticator app instead": "No camera? Use this secret in your authenticator app instead",
"No Captcha": "No Captcha",
"No change": "No change",
"No files found": "No files found",
"No Filters": "No Filters",
"No Logs.": "No Logs.",
"No news.": "No news.",
"No Permission": "No Permission",
"No posts.": "No posts.",
"No reason specified": "No reason specified",
"No reports to dismiss": "No reports to dismiss",
"No reports.": "No reports.",
"No results.": "No results.",
"No threads selected to Bumplock": "No threads selected to Bumplock",
@ -903,6 +931,10 @@
"Unlimit media height": "Unlimit media height",
"Unlimit Media Height": "Unlimit Media Height",
"Unlink Files": "Unlink Files",
"Unlinked %s files": {
"one": "Unlinked %s file",
"other": "Unlinked %s files"
},
"Unlist from webring": "Unlist from webring",
"Unlist locally": "Unlist locally",
"Unlisted From Webring": "Unlisted From Webring",
@ -979,4 +1011,4 @@
"Your request was blocked because your IP address is listed on a blacklist.": "Your request was blocked because your IP address is listed on a blacklist.",
"Your upload was too large": "Your upload was too large",
"Zoom": "Zoom"
}
}

@ -261,6 +261,7 @@
"Change Password": "Alterar Password",
"Clear": "Limpar",
"Click here if you are not redirected automatically.": "Se não fores redirecionado automaticamente, podes clicar aqui.",
"Client aborted request": "Client aborted request",
"Close": "Fechar",
"Code Block": "Bloco de Código",
"Code Highlight Language Detect Threshold": "Limiar Para Detetar Línguas de Código",
@ -321,6 +322,28 @@
"Delete Selected": "Apagar selecionados",
"Delete selected layers?": "Apagar camadas selecionadas?",
"Delete your account": "Apagar conta",
"Deleted %s accounts": {
"one": "Deleted %s account",
"other": "Deleted %s accounts"
},
"Deleted %s assets": {
"one": "Deleted %s asset",
"other": "Deleted %s assets"
},
"Deleted %s banners": {
"one": "Deleted %s banner",
"other": "Deleted %s banners"
},
"Deleted %s custom pages": {
"one": "Deleted %s custom page",
"other": "Deleted %s custom pages"
},
"Deleted %s files from server": {
"one": "Deleted %s file from server",
"other": "Deleted %s files from server"
},
"Deleted flags": "Deleted flags",
"Deleted news": "Deleted news",
"Deny Appeal": "Negar Recurso",
"Descending": "Descendente",
"Description": "Descrição",
@ -333,6 +356,7 @@
"Disconnected": "Desligado",
"Dismiss Global Reports": "Ignorar Deúncias Globais",
"Dismiss Reports": "Ignorar Denúncias",
"Dismissed reports": "Dismissed reports",
"Distortion Intensity": "Intensidade da Distorção",
"DNSBL": "DNSBL",
"DNSBL Addresses": "Endereços DNSBL",
@ -515,12 +539,14 @@
"Index": "Index",
"Index View": "Index",
"Inline Monospace": "Linha Monoespacial",
"Internal server error": "Erro interno do servidor",
"Internal Server Error": "Erro interno do servidor",
"Invalid CSRF token": "Invalid CSRF token",
"Invalid dimensions.": "Dimensões inválidas.",
"Invalid file \"%s\". Max banner dimensions are %sx%s and must be a 3:1 aspect ratio.": "Ficheiro inválido \"%s\". Dimensões máximas de banner são %sx%s e têm que respeitar um rácio 3:1.",
"Invalid file \"%s\". Max banner dimensions are %sx%s.": "Ficheiro inválido \"%s\". Dimensões máximas de banner são %sx%s.",
"Invalid file type for %s. Mimetype %s not allowed.": "Tipo de ficheiro inválido para %s. Tipo %s não permitido.",
"Invalid or missing \"Referer\" header. Are you posting from the correct URL?": "Header \"Referer\" inválida. Estás a usar o URL correto?",
"Invalid request body": "Invalid request body",
"IP": "IP",
"IP Header": "IP Header",
"IP/Hash": "IP/Hash",
@ -632,12 +658,14 @@
"No camera? Use this secret in your authenticator app instead": "Sem câmara? Usa este segredo na tua aplicação de autenticação",
"No Captcha": "Sem Captcha",
"No change": "No alteração",
"No files found": "No files found",
"No Filters": "Sem Filtros",
"No Logs.": "Sem Logs.",
"No news.": "Sem notícias.",
"No Permission": "Sem Permissões",
"No posts.": "Sem publicações.",
"No reason specified": "Sem motivo especificado",
"No reports to dismiss": "No reports to dismiss",
"No reports.": "Sem denúncias.",
"No results.": "Sem resultados.",
"No threads selected to Bumplock": "No threads selected to Bumplock",
@ -903,6 +931,10 @@
"Unlimit media height": "Não limitar tamanho ficheiros abertos",
"Unlimit Media Height": "Altura Media Ilimitado",
"Unlink Files": "Remover Ficheiros",
"Unlinked %s files": {
"one": "Unlinked %s file",
"other": "Unlinked %s files"
},
"Unlist from webring": "Remover do webring",
"Unlist locally": "Remover localmente",
"Unlisted From Webring": "Remover do Webring",
@ -979,4 +1011,4 @@
"Your request was blocked because your IP address is listed on a blacklist.": "O teu pedido foi bloqueado porque o teu IP está numa blacklist.",
"Your upload was too large": "O teu carregamento é demasiado grande",
"Zoom": "Zoom"
}
}

@ -261,6 +261,7 @@
"Change Password": "Изменить пароль.",
"Clear": "Очистить",
"Click here if you are not redirected automatically.": "Нажмите здесь, если вы не перенаправлены автоматически.",
"Client aborted request": "Client aborted request",
"Close": "Закрыть",
"Code Block": "Блок кода",
"Code Highlight Language Detect Threshold": "Порог определения языка выделения кода",
@ -321,6 +322,28 @@
"Delete Selected": "Удалить выбранные",
"Delete selected layers?": "Удалить выбранные слои?",
"Delete your account": "Удалить свою учетную запись",
"Deleted %s accounts": {
"one": "Deleted %s account",
"other": "Deleted %s accounts"
},
"Deleted %s assets": {
"one": "Deleted %s asset",
"other": "Deleted %s assets"
},
"Deleted %s banners": {
"one": "Deleted %s banner",
"other": "Deleted %s banners"
},
"Deleted %s custom pages": {
"one": "Deleted %s custom page",
"other": "Deleted %s custom pages"
},
"Deleted %s files from server": {
"one": "Deleted %s file from server",
"other": "Deleted %s files from server"
},
"Deleted flags": "Deleted flags",
"Deleted news": "Deleted news",
"Deny Appeal": "Отклонить апелляцию",
"Descending": "По убыванию",
"Description": "Описание",
@ -333,6 +356,7 @@
"Disconnected": "Отключен",
"Dismiss Global Reports": "Отклонить глобальные отчеты",
"Dismiss Reports": "Отклонять отчеты",
"Dismissed reports": "Dismissed reports",
"Distortion Intensity": "Интенсивность искажения",
"DNSBL": "DNSBL",
"DNSBL Addresses": "Адреса DNSBL",
@ -515,12 +539,14 @@
"Index": "Индекс",
"Index View": "Вид индекса",
"Inline Monospace": "Встроенное моноширинное пространство",
"Internal server error": "Внутренняя ошибка сервера",
"Internal Server Error": "Внутренняя ошибка сервера",
"Invalid CSRF token": "Invalid CSRF token",
"Invalid dimensions.": "Недопустимые измерения",
"Invalid file \"%s\". Max banner dimensions are %sx%s and must be a 3:1 aspect ratio.": "Недопустимый файл \"%s\". Максимальные размеры баннера составляют %sx%s и должны иметь соотношение сторон 3:1.",
"Invalid file \"%s\". Max banner dimensions are %sx%s.": "Недопустимый файл \"%s\". Максимальные размеры баннера составляют %sx%s.",
"Invalid file type for %s. Mimetype %s not allowed.": "Недопустимый тип файла для %s. Mimetype %s не разрешен.",
"Invalid or missing \"Referer\" header. Are you posting from the correct URL?": "Недопустимый или отсутствующий заголовок \"Refererer\". Вы отправляете сообщения с правильного URL-адреса?",
"Invalid request body": "Invalid request body",
"IP": "IP",
"IP Header": "Заголовок IP",
"IP/Hash": "IP / Hash",
@ -632,12 +658,14 @@
"No camera? Use this secret in your authenticator app instead": "Нет камеры? Вместо этого используйте этот секрет в своем приложении-аутентификаторе ",
"No Captcha": "Без капчи",
"No change": "Ничего не делать",
"No files found": "No files found",
"No Filters": "Нет фильтров",
"No Logs.": "Нет журналов",
"No news.": "Нет новостей",
"No Permission": "Нет разрешения",
"No posts.": "Нет сообщений.",
"No reason specified": "Причина не указана",
"No reports to dismiss": "No reports to dismiss",
"No reports.": "Нет отчетов.",
"No results.": "Нет результатов.",
"No threads selected to Bumplock": "Нет нитей, выбранных для блокировки",
@ -903,6 +931,10 @@
"Unlimit media height": "Неограниченная высота носителя",
"Unlimit Media Height": "Неограниченная высота носителя",
"Unlink Files": "Отменить привязку файлов",
"Unlinked %s files": {
"one": "Unlinked %s file",
"other": "Unlinked %s files"
},
"Unlist from webring": "Удалить список из webring",
"Unlist locally": "Отменить список локально",
"Unlisted From Webring": "Не внесен в список из Webring",
@ -979,4 +1011,4 @@
"Your request was blocked because your IP address is listed on a blacklist.": "Ваш запрос был заблокирован, потому что ваш IP-адрес внесен в черный список.",
"Your upload was too large": "Ваша загрузка была слишком большой",
"Zoom": "Увеличить"
}
}

@ -166,7 +166,7 @@ module.exports = async (req, res, next) => {
}
if (req.body.delete_file) {
const { message } = await deletePostsFiles(res.locals.posts, false); //delete files, not just unlink
const { message } = await deletePostsFiles(res.locals, false); //delete files, not just unlink
messages.push(message);
}
const { action, message } = await deletePosts(res.locals.posts, req.body.delete_ip_global ? null : req.params.board);
@ -210,7 +210,7 @@ module.exports = async (req, res, next) => {
// if it was getting deleted/moved, dont do these actions
if (req.body.unlink_file || req.body.delete_file) {
const { message, action, query } = await deletePostsFiles(res.locals.posts, req.body.unlink_file);
const { message, action, query } = await deletePostsFiles(res.locals, req.body.unlink_file);
if (action) {
if (req.body.unlink_file) {
modlogActions.push('Unlink files');

@ -6,6 +6,7 @@ const { Accounts, Boards } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __, __n } = res.locals;
const accountsWithBoards = await Accounts.getOwnedOrStaffBoards(req.body.checkedaccounts);
if (accountsWithBoards.length > 0) {
const bulkWrites = [];
@ -62,8 +63,8 @@ module.exports = async (req, res) => {
}));
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': `Deleted ${amount} accounts`,
'title': __('Success'),
'message': __n('Deleted %s accounts', amount),
'redirect': '/globalmanage/accounts.html'
});

@ -8,6 +8,7 @@ const { remove } = require('fs-extra')
module.exports = async (req, res) => {
const { __ } = res.locals;
const redirect = `/${req.params.board}/manage/assets.html`;
//delete file of all selected assets
@ -24,8 +25,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': `Deleted ${amount} assets.`,
'title': __('Success'),
'message': __('Deleted %s assets', amount),
'redirect': redirect
});
};

@ -9,6 +9,7 @@ const { remove } = require('fs-extra')
module.exports = async (req, res) => {
const { __ } = res.locals;
const redirect = `/${req.params.board}/manage/assets.html`;
//delete file of all selected banners
@ -33,8 +34,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': `Deleted ${amount} banners.`,
'title': __('Success'),
'message': __('Deleted %s banners', amount),
'redirect': redirect
});
};

@ -7,6 +7,7 @@ const uploadDirectory = require(__dirname+'/../../lib/file/uploaddirectory.js')
module.exports = async (req, res) => {
const { __, __n } = res.locals;
const deletedCount = await CustomPages.deleteMany(req.body.checkedcustompages, req.params.board).then(res => res.deletedCount);
if (deletedCount === 0) {
@ -25,8 +26,8 @@ module.exports = async (req, res) => {
}));
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': 'Deleted custom pages',
'title': __('Success'),
'message': __n('Deleted %s custom pages', deletedCount),
'redirect': `/${req.params.board}/manage/custompages.html`
});

@ -8,6 +8,7 @@ const { remove } = require('fs-extra')
module.exports = async (req, res) => {
const { __ } = res.locals;
const redirect = `/${req.params.board}/manage/assets.html`;
const updatedFlags = res.locals.board.flags;
@ -38,8 +39,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': 'Deleted flags.',
'title': __('Success'),
'message': __('Deleted flags'),
'redirect': redirect
});
};

@ -6,6 +6,8 @@ const { News } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
await News.deleteMany(req.body.checkednews);
buildQueue.push({
@ -14,8 +16,8 @@ module.exports = async (req, res) => {
});
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': 'Deleted news',
'title': __('Success'),
'message': __('Deleted news'),
'redirect': '/globalmanage/news.html'
});

@ -5,8 +5,9 @@ const { Files } = require(__dirname+'/../../db/')
, { func: pruneFiles } = require(__dirname+'/../../schedules/tasks/prune.js')
, deletePostFiles = require(__dirname+'/../../lib/file/deletepostfiles.js');
module.exports = async (posts, unlinkOnly) => {
module.exports = async (locals, unlinkOnly) => {
const { posts, __, __n } = locals;
const { pruneImmediately } = config.get;
//get filenames from all the posts
@ -27,7 +28,7 @@ module.exports = async (posts, unlinkOnly) => {
if (files.length == 0) {
return {
message: 'No files found'
message: __('No files found')
};
}
@ -41,7 +42,7 @@ module.exports = async (posts, unlinkOnly) => {
if (unlinkOnly) {
return {
message:`Unlinked ${files.length} file(s) across ${posts.length} post(s)`,
message: __n('Unlinked %s files', files.length),
action:'$set',
query: {
'files': []
@ -51,7 +52,7 @@ module.exports = async (posts, unlinkOnly) => {
//delete all the files
await deletePostFiles(files);
return {
message:`Deleted ${files.length} file(s) from server`,
message: __n('Deleted %s files from server', files.length),
//NOTE: only deletes from selected posts. other posts with same image will 404
action:'$set',
query: {

@ -5,6 +5,7 @@ const { Boards, Accounts } = require(__dirname+'/../../db/')
module.exports = async (req, res) => {
const { __ } = res.locals;
//only a ROOT could do this, per the permission bypass in the controller
const deletingBoardOwner = req.body.checkedstaff.some(s => s === res.locals.board.owner);
@ -16,8 +17,8 @@ module.exports = async (req, res) => {
]);
return dynamicResponse(req, res, 200, 'message', {
'title': res.locals.__('Success'),
'message': 'Deleted staff',
'title': __('Success'),
'message': __('Deleted staff'),
'redirect': `/${req.params.board}/manage/staff.html`,
});

@ -1,19 +1,21 @@
'use strict';
module.exports = (posts) => {
module.exports = (locals) => {
const { posts, __ } = locals;
const filteredposts = posts.filter(post => {
return post.globalreports.length > 0;
});
if (filteredposts.length === 0) {
return {
message: 'No global report(s) to dismiss'
message: __('No global reports to dismiss'),
};
}
return {
message: 'Dismissed global report(s)',
message: __('Dismissed global reports'),
action: '$set',
query: {
'globalreports': []

@ -2,19 +2,21 @@
module.exports = (req, res) => {
const filteredposts = res.locals.posts.filter(post => {
const { posts, __ } = res.locals;
const filteredposts = posts.filter(post => {
return (req.body.global_dismiss && post.globalreports.length > 0)
|| (req.body.dismiss && post.reports.length > 0);
});
if (filteredposts.length === 0) {
return {
message: 'No report(s) to dismiss'
message: __('No reports to dismiss'),
};
}
const ret = {
message: 'Dismissed reports',
message: __('Dismissed reports'),
action: '$set',
query: {}
};

@ -120,7 +120,7 @@ const config = require(__dirname+'/lib/misc/config.js')
// catch any unhandled errors
app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars
const { __ } = res.locals;
let errStatus = 500;
let errMessage = 'Internal Server Error';
if (err.code === 'EBADCSRFTOKEN') {
@ -144,7 +144,7 @@ const config = require(__dirname+'/lib/misc/config.js')
errMessage = 'Client aborted request';
break;
case 'entity.too.large':
errMessage = res.locals.__('Your upload was too large');
errMessage = 'Your upload was too large';
break;
default:
break;
@ -155,8 +155,8 @@ const config = require(__dirname+'/lib/misc/config.js')
console.error(err);
}
return dynamicResponse(req, res, errStatus, 'message', {
'title': errStatus === 500 ? 'Internal Server Error' : 'Bad Request',
'error': errMessage,
'title': __(errStatus === 500 ? 'Internal Server Error' : 'Bad Request'),
'error': __(errMessage),
'redirect': req.headers.referer || '/'
});
});

@ -1,4 +1,4 @@
extends ../layout.pug
block content
h1 #{__('Internal server error')}
h1 #{__('Internal Server Error')}

Loading…
Cancel
Save