diff --git a/package-lock.json b/package-lock.json index e0a5d6b..ae41cbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,10 @@ "license": "ISC", "dependencies": { "colors": "^1.4.0", + "cookie-parser": "^1.4.5", "express": "^4.17.1", "express-handlebars": "^4.0.4", + "express-locale": "^2.0.0", "fs-extra": "^9.1.0", "ioredis": "^4.26.0", "morgan": "^1.10.0", @@ -156,6 +158,18 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "dependencies": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -287,6 +301,11 @@ "node": ">=0.10" } }, + "node_modules/express-locale": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/express-locale/-/express-locale-2.0.0.tgz", + "integrity": "sha512-SUwsgOTV8lplAkgyfKSwKH3ZVSKUrAa+b48acPGXpwWX211WZ/BYWX2WcZO57+xLOqPYb6rSNpWCFnhGrt0moA==" + }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -1114,6 +1133,15 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -1224,6 +1252,11 @@ "promise": "^8.1.0" } }, + "express-locale": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/express-locale/-/express-locale-2.0.0.tgz", + "integrity": "sha512-SUwsgOTV8lplAkgyfKSwKH3ZVSKUrAa+b48acPGXpwWX211WZ/BYWX2WcZO57+xLOqPYb6rSNpWCFnhGrt0moA==" + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", diff --git a/package.json b/package.json index 1ccbbd2..cb99e41 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,10 @@ "homepage": "https://github.com/PretendoNetwork/website#readme", "dependencies": { "colors": "^1.4.0", + "cookie-parser": "^1.4.5", "express": "^4.17.1", "express-handlebars": "^4.0.4", + "express-locale": "^2.0.0", "fs-extra": "^9.1.0", "ioredis": "^4.26.0", "morgan": "^1.10.0", diff --git a/public/assets/css/main.css b/public/assets/css/main.css index c659843..347bd49 100644 --- a/public/assets/css/main.css +++ b/public/assets/css/main.css @@ -80,6 +80,9 @@ header nav a { text-decoration: none; } +.locale-dropdown { + margin-left: auto; +} /* Misc */ .purple-circle { diff --git a/public/assets/js/locale-dropdown-handler.js b/public/assets/js/locale-dropdown-handler.js new file mode 100644 index 0000000..a3b561c --- /dev/null +++ b/public/assets/js/locale-dropdown-handler.js @@ -0,0 +1,11 @@ +function setFormDefaultLocale(localeString) { + try { + document.querySelector(`option[value=${localeString}`).selected = true; + } catch {} // If the locale isn't listed +} + +function localeFormHandler() { + const selectedLocale = document.querySelector("#locale-dropdown").value; + document.cookie = `preferredLocale=${selectedLocale};max-age=31536000`; + window.location.reload(); +} diff --git a/src/routers/home.js b/src/routers/home.js index 84dba26..8d02c6b 100644 --- a/src/routers/home.js +++ b/src/routers/home.js @@ -5,12 +5,16 @@ const router = new Router(); const { getTrelloCache } = require('../trello'); router.get('/', async (request, response) => { - const tmpLocale = util.getLocale('US', 'en'); + + const reqLocale = request.locale + const locale = util.getLocale(reqLocale.region, reqLocale.language); + const cache = await getTrelloCache(); response.render('home', { layout: 'main', - locale: tmpLocale, + locale, + localeString: reqLocale.toString(), featuredFeatureList: cache.sections[0] }); }); diff --git a/src/routers/progress.js b/src/routers/progress.js index 6d590f4..b7ed205 100644 --- a/src/routers/progress.js +++ b/src/routers/progress.js @@ -5,12 +5,18 @@ const router = new Router(); const { getTrelloCache } = require('../trello'); router.get('/', async (request, response) => { - const tmpLocale = util.getLocale('US', 'en'); + + const reqLocale = request.locale + const locale = util.getLocale(reqLocale.region, reqLocale.language); + + const localeString = reqLocale.toString() + const cache = await getTrelloCache(); response.render('progress', { layout: 'main', - locale: tmpLocale, + locale, + localeString, progressLists: cache }); }); diff --git a/src/server.js b/src/server.js index 9136623..ae3e41d 100644 --- a/src/server.js +++ b/src/server.js @@ -3,6 +3,8 @@ process.title = 'Pretendo - Website'; const express = require('express'); const handlebars = require('express-handlebars'); const morgan = require('morgan'); +const expressLocale = require('express-locale'); +const cookieParser = require('cookie-parser') const logger = require('./logger'); const util = require('./util'); const config = require('../config.json'); @@ -23,6 +25,27 @@ const routers = { progress: require('./routers/progress') }; +app.use(cookieParser()) + +// Locale express middleware setup +app.use(expressLocale({ + "priority": ["cookie", "accept-language", "map", "default"], + cookie: {name: 'preferredLocale'}, + // fallbacks for browsers that don't send a region code, but only a language + map: { + de: 'de-DE', + es: 'es-ES', + fr: 'fr-FR', + it: 'it-IT', + ko: 'ko-KR', + ru: 'ru-RU', + }, + "default": "en-US" +})) + + + + app.use('/', routers.home); app.use('/faq', routers.faq); app.use('/progress', routers.progress); diff --git a/views/layouts/main.handlebars b/views/layouts/main.handlebars index 267ebab..fac0f27 100644 --- a/views/layouts/main.handlebars +++ b/views/layouts/main.handlebars @@ -40,5 +40,8 @@ + + + \ No newline at end of file diff --git a/views/partials/header.handlebars b/views/partials/header.handlebars index 384efe3..cda76c7 100644 --- a/views/partials/header.handlebars +++ b/views/partials/header.handlebars @@ -30,4 +30,11 @@ {{ locale.nav.credits }} {{ locale.nav.progress }} + + + \ No newline at end of file