From 679d095d98714efe21d993dc87cc7593236bc413 Mon Sep 17 00:00:00 2001 From: Thomas Lynch Date: Sat, 14 Jan 2023 22:47:30 +1100 Subject: [PATCH] Start on localisation ref #396 --- controllers/pages.js | 3 +- lib/locale/locale.js | 18 ++++++ lib/middleware/locale/locale.js | 25 ++++++++ locales/en.json | 3 + locales/pt.json | 3 + models/pages/manage/catalog.js | 2 +- package-lock.json | 106 ++++++++++++++++++++++++++++++++ package.json | 1 + server.js | 6 +- views/pages/catalog.pug | 1 + 10 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 lib/locale/locale.js create mode 100644 lib/middleware/locale/locale.js create mode 100644 locales/en.json create mode 100644 locales/pt.json diff --git a/controllers/pages.js b/controllers/pages.js index a6679e6c..16e8c249 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -16,6 +16,7 @@ const express = require('express') , sessionRefresh = require(__dirname+'/../lib/middleware/permission/sessionrefresh.js') , csrf = require(__dirname+'/../lib/middleware/misc/csrfmiddleware.js') , setMinimal = require(__dirname+'/../lib/middleware/misc/setminimal.js') + , localise = require(__dirname+'/../lib/middleware/locale/locale.js') //page models , { manageRecent, manageReports, manageAssets, manageSettings, manageBans, editCustomPage, manageMyPermissions, manageBoard, manageThread, manageLogs, manageCatalog, manageCustomPages, manageStaff, editStaff, editPost } = require(__dirname+'/../models/pages/manage/') @@ -56,7 +57,7 @@ router.get('/settings.json', globalSettings); //public global settings router.get('/randombanner', randombanner); //random banner //board manage pages -router.get('/:board/manage/catalog.html', useSession, sessionRefresh, isLoggedIn, Boards.exists, calcPerms, +router.get('/:board/manage/catalog.html', useSession, sessionRefresh, isLoggedIn, Boards.exists, localise, calcPerms, hasPerms.one(Permissions.MANAGE_BOARD_GENERAL), csrf, manageCatalog); router.get('/:board/manage/:page(1[0-9]{1,}|[2-9][0-9]{0,}|index).html', useSession, sessionRefresh, isLoggedIn, Boards.exists, calcPerms, hasPerms.one(Permissions.MANAGE_BOARD_GENERAL), csrf, manageBoard); diff --git a/lib/locale/locale.js b/lib/locale/locale.js new file mode 100644 index 00000000..01f78f78 --- /dev/null +++ b/lib/locale/locale.js @@ -0,0 +1,18 @@ +'use strict'; + +const i18n = require('i18n') + , path = require('path') + , { debugLogs } = require(__dirname+'/../../configs/secrets.js'); + +i18n.configure({ + directory: path.join(__dirname, '/../../locales'), + defaultLocale: 'en', + retryInDefaultLocale: false, + cookie: null, + header: null, + queryParameter: null, +}); + +debugLogs && console.log('Locales loaded:', i18n.getLocales()); + +module.exports = i18n; diff --git a/lib/middleware/locale/locale.js b/lib/middleware/locale/locale.js new file mode 100644 index 00000000..c7335fec --- /dev/null +++ b/lib/middleware/locale/locale.js @@ -0,0 +1,25 @@ +'use strict'; + +const i18n = require(__dirname+'/../../locale/locale.js') + , config = require(__dirname+'/../../misc/config.js'); + +module.exports = (req, res, next) => { + + // global settings locale + let { locale } = config.get; + + /* TODO + // board settings locale + if (board in res.locals/params) { + locale = board.settings.locale; + } + */ + + //TESTING + const locale = Math.random() < 0.5 ? 'en' : 'pt'; + console.log('setting locale', locale); + i18n.setLocale(res.locals, locale); + + next(); + +}; diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 00000000..658d2f24 --- /dev/null +++ b/locales/en.json @@ -0,0 +1,3 @@ +{ + "test": "test" +} diff --git a/locales/pt.json b/locales/pt.json new file mode 100644 index 00000000..f9e7364f --- /dev/null +++ b/locales/pt.json @@ -0,0 +1,3 @@ +{ + "test": "teste" +} diff --git a/models/pages/manage/catalog.js b/models/pages/manage/catalog.js index 8a8b06fc..1c7c2508 100644 --- a/models/pages/manage/catalog.js +++ b/models/pages/manage/catalog.js @@ -12,7 +12,7 @@ module.exports = async (req, res, next) => { } res - .set('Cache-Control', 'private, max-age=5') + //.set('Cache-Control', 'private, max-age=5') .render('catalog', { modview: true, threads, diff --git a/package-lock.json b/package-lock.json index 78c3de61..9353a03f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "gulp-replace": "^1.1.4", "gulp-uglify-es": "^3.0.0", "highlight.js": "^11.7.0", + "i18n": "^0.15.1", "i18n-iso-countries": "^6.8.0", "iconv-lite": "^0.6.3", "imghash": "^0.0.9", @@ -2305,6 +2306,45 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@messageformat/core": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.0.1.tgz", + "integrity": "sha512-yxj2+0e46hcZqJfNf0ZYbC2q6WlcGoh4g11mCyRtTueR0AD8F9z4JMYAS1aOiFG8Vl1LZg/h5hZHKmWTAyZq8g==", + "dependencies": { + "@messageformat/date-skeleton": "^1.0.0", + "@messageformat/number-skeleton": "^1.0.0", + "@messageformat/parser": "^5.0.0", + "@messageformat/runtime": "^3.0.1", + "make-plural": "^7.0.0", + "safe-identifier": "^0.4.1" + } + }, + "node_modules/@messageformat/date-skeleton": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz", + "integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==" + }, + "node_modules/@messageformat/number-skeleton": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.1.0.tgz", + "integrity": "sha512-F0Io+GOSvFFxvp9Ze3L5kAoZ2NnOAT0Mr/jpGNd3fqo8A0t4NxNIAcCdggtl2B/gN2ErkIKSBVPrF7xcW1IGvA==" + }, + "node_modules/@messageformat/parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.0.0.tgz", + "integrity": "sha512-WiDKhi8F0zQaFU8cXgqq69eYFarCnTVxKcvhAONufKf0oUxbqLMW6JX6rV4Hqh+BEQWGyKKKHY4g1XA6bCLylA==", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@messageformat/runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", + "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", + "dependencies": { + "make-plural": "^7.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3967,6 +4007,11 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -6368,6 +6413,17 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-printf": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz", + "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", + "dependencies": { + "boolean": "^3.1.4" + }, + "engines": { + "node": ">=10.0" + } + }, "node_modules/fast-xml-parser": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", @@ -7796,6 +7852,25 @@ "node": ">=10.17.0" } }, + "node_modules/i18n": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.1.tgz", + "integrity": "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA==", + "dependencies": { + "@messageformat/core": "^3.0.0", + "debug": "^4.3.3", + "fast-printf": "^1.6.9", + "make-plural": "^7.0.0", + "math-interval-parser": "^2.0.1", + "mustache": "^4.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/mashpie" + } + }, "node_modules/i18n-iso-countries": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-6.8.0.tgz", @@ -9870,6 +9945,11 @@ "node": ">=0.10.0" } }, + "node_modules/make-plural": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.2.0.tgz", + "integrity": "sha512-WkdI+iaWaBCFM2wUXwos8Z7spg5Dt64Xe/VI6NpRaly21cDtD76N6S97K//UtzV0dHOiXX+E90TnszdXHG0aMg==" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -10079,6 +10159,14 @@ "node": ">=0.10.0" } }, + "node_modules/math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10422,11 +10510,24 @@ "node": ">=12" } }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -13185,6 +13286,11 @@ } ] }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" + }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", diff --git a/package.json b/package.json index 0c309aab..abb835b5 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "gulp-replace": "^1.1.4", "gulp-uglify-es": "^3.0.0", "highlight.js": "^11.7.0", + "i18n": "^0.15.1", "i18n-iso-countries": "^6.8.0", "iconv-lite": "^0.6.3", "imghash": "^0.0.9", diff --git a/server.js b/server.js index 3630ca38..b42fc867 100644 --- a/server.js +++ b/server.js @@ -17,7 +17,8 @@ const config = require(__dirname+'/lib/misc/config.js') , { version } = require(__dirname+'/package.json') , formatSize = require(__dirname+'/lib/converter/formatsize.js') , CachePugTemplates = require('cache-pug-templates') - , { Permissions } = require(__dirname+'/lib/permission/permissions.js'); + , { Permissions } = require(__dirname+'/lib/permission/permissions.js') + , i18n = require(__dirname+'/lib/locale/locale.js'); (async () => { @@ -101,6 +102,9 @@ const config = require(__dirname+'/lib/misc/config.js') app.use(express.static(__dirname+'/static/json', { redirect: false })); } + //localisation + app.use(i18n.init); + app.use('/forms', require(__dirname+'/controllers/forms.js')); app.use('/', require(__dirname+'/controllers/pages.js')); diff --git a/views/pages/catalog.pug b/views/pages/catalog.pug index aaf39632..50b799dc 100644 --- a/views/pages/catalog.pug +++ b/views/pages/catalog.pug @@ -9,6 +9,7 @@ block head title /#{board._id}/ - Catalog block content + h1 locale test: #{__("test")} +boardheader(modview ? 'Mod Catalog' : 'Catalog') br include ../includes/postform.pug