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
{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)},
},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: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)},
{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: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')},
"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":"Ширина холста в пикселях",
'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),