mirror of
https://github.com/PretendoNetwork/website.git
synced 2026-04-26 10:04:25 -05:00
Add auto locale detection and custom locale selection (preference saved to cookie)
This commit is contained in:
parent
1d3f42eb5c
commit
8e0a40079c
33
package-lock.json
generated
33
package-lock.json
generated
|
|
@ -10,8 +10,10 @@
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"colors": "^1.4.0",
|
"colors": "^1.4.0",
|
||||||
|
"cookie-parser": "^1.4.5",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-handlebars": "^4.0.4",
|
"express-handlebars": "^4.0.4",
|
||||||
|
"express-locale": "^2.0.0",
|
||||||
"fs-extra": "^9.1.0",
|
"fs-extra": "^9.1.0",
|
||||||
"ioredis": "^4.26.0",
|
"ioredis": "^4.26.0",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
|
|
@ -156,6 +158,18 @@
|
||||||
"node": ">= 0.6"
|
"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": {
|
"node_modules/cookie-signature": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||||
|
|
@ -287,6 +301,11 @@
|
||||||
"node": ">=0.10"
|
"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": {
|
"node_modules/finalhandler": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
"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",
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
|
||||||
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
|
"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": {
|
"cookie-signature": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||||
|
|
@ -1224,6 +1252,11 @@
|
||||||
"promise": "^8.1.0"
|
"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": {
|
"finalhandler": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,10 @@
|
||||||
"homepage": "https://github.com/PretendoNetwork/website#readme",
|
"homepage": "https://github.com/PretendoNetwork/website#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"colors": "^1.4.0",
|
"colors": "^1.4.0",
|
||||||
|
"cookie-parser": "^1.4.5",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-handlebars": "^4.0.4",
|
"express-handlebars": "^4.0.4",
|
||||||
|
"express-locale": "^2.0.0",
|
||||||
"fs-extra": "^9.1.0",
|
"fs-extra": "^9.1.0",
|
||||||
"ioredis": "^4.26.0",
|
"ioredis": "^4.26.0",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,9 @@ header nav a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.locale-dropdown {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
/* Misc */
|
/* Misc */
|
||||||
.purple-circle {
|
.purple-circle {
|
||||||
|
|
|
||||||
11
public/assets/js/locale-dropdown-handler.js
Normal file
11
public/assets/js/locale-dropdown-handler.js
Normal file
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
@ -5,12 +5,16 @@ const router = new Router();
|
||||||
const { getTrelloCache } = require('../trello');
|
const { getTrelloCache } = require('../trello');
|
||||||
|
|
||||||
router.get('/', async (request, response) => {
|
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();
|
const cache = await getTrelloCache();
|
||||||
|
|
||||||
response.render('home', {
|
response.render('home', {
|
||||||
layout: 'main',
|
layout: 'main',
|
||||||
locale: tmpLocale,
|
locale,
|
||||||
|
localeString: reqLocale.toString(),
|
||||||
featuredFeatureList: cache.sections[0]
|
featuredFeatureList: cache.sections[0]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,18 @@ const router = new Router();
|
||||||
const { getTrelloCache } = require('../trello');
|
const { getTrelloCache } = require('../trello');
|
||||||
|
|
||||||
router.get('/', async (request, response) => {
|
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();
|
const cache = await getTrelloCache();
|
||||||
|
|
||||||
response.render('progress', {
|
response.render('progress', {
|
||||||
layout: 'main',
|
layout: 'main',
|
||||||
locale: tmpLocale,
|
locale,
|
||||||
|
localeString,
|
||||||
progressLists: cache
|
progressLists: cache
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@ process.title = 'Pretendo - Website';
|
||||||
const express = require('express');
|
const express = require('express');
|
||||||
const handlebars = require('express-handlebars');
|
const handlebars = require('express-handlebars');
|
||||||
const morgan = require('morgan');
|
const morgan = require('morgan');
|
||||||
|
const expressLocale = require('express-locale');
|
||||||
|
const cookieParser = require('cookie-parser')
|
||||||
const logger = require('./logger');
|
const logger = require('./logger');
|
||||||
const util = require('./util');
|
const util = require('./util');
|
||||||
const config = require('../config.json');
|
const config = require('../config.json');
|
||||||
|
|
@ -23,6 +25,27 @@ const routers = {
|
||||||
progress: require('./routers/progress')
|
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('/', routers.home);
|
||||||
app.use('/faq', routers.faq);
|
app.use('/faq', routers.faq);
|
||||||
app.use('/progress', routers.progress);
|
app.use('/progress', routers.progress);
|
||||||
|
|
|
||||||
|
|
@ -40,5 +40,8 @@
|
||||||
</div>
|
</div>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.2/chart.min.js"></script>
|
||||||
<script src="/assets/js/progress-charts.js"></script>
|
<script src="/assets/js/progress-charts.js"></script>
|
||||||
|
<script src="/assets/js/locale-dropdown-handler.js"></script>
|
||||||
|
<script>setFormDefaultLocale("{{localeString}}")</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
@ -30,4 +30,11 @@
|
||||||
<a href="/#credits">{{ locale.nav.credits }}</a>
|
<a href="/#credits">{{ locale.nav.credits }}</a>
|
||||||
<a href="/progress" class="keep-on-mobile">{{ locale.nav.progress }}</a>
|
<a href="/progress" class="keep-on-mobile">{{ locale.nav.progress }}</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
<select id="locale-dropdown" name="locale-dropdown" class="locale-dropdown" onchange="localeFormHandler()">
|
||||||
|
<option value="en-US">🇺🇸 English</option>
|
||||||
|
<option value="it-IT">🇮🇹 Italiano</option>
|
||||||
|
<option value="ru-RU">🇷🇺 Pусский</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
Loading…
Reference in New Issue
Block a user