diff --git a/app.js b/app.js index 0feeba4c0f15393a90788c3491edc7f758b19463..bcbbfbfea641c144798b6d65c147f34e033622e8 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ const bodyParser = require('body-parser'); const session = require('express-session'); const errorhandler = require('errorhandler'); const flash = require('express-flash'); +const i18n = require('i18n'); // internationalization var env = process.env.NODE_ENV || 'development'; const config = require('./config/config')[env]; @@ -47,10 +48,17 @@ app.use(function(req, res, next) { next(); }); -require('./routes/routes')(app, config, passport); +// internationalization (i18n) +i18n.configure({ + locales:['de', 'en'], + directory: './locales' +}); +app.use(i18n.init); + +require('./routes/routes')(app, config, passport, i18n); //require('./routes/dbconn')(app, config); require('./routes/api')(app, config, passport); app.listen(app.get('port'), function () { console.log('Express server listening on port ' + app.get('port')); -}); +}); \ No newline at end of file diff --git a/locales/de.json b/locales/de.json new file mode 100644 index 0000000000000000000000000000000000000000..13a9c09210fdde2225ce2a378649592f2e9826db --- /dev/null +++ b/locales/de.json @@ -0,0 +1,4 @@ +{ + "Hello World": "Hallo Welt", + "Hello": "Hallo" +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 0000000000000000000000000000000000000000..0873ff891aa278c7cf58ff1bb548db68ed5b2edf --- /dev/null +++ b/locales/en.json @@ -0,0 +1,4 @@ +{ + "Hello World": "Hello World", + "Hello": "Hello", +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7e0b9410173ec70a82e917802eaddf31fb60bb14..1d68e8a53382d986c1ce142141d82f6da46cbc04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -748,6 +748,19 @@ } } }, + "i18n": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.5.tgz", + "integrity": "sha512-6UgLbhJGgn4XFeuZc/dDdrrri0ij24EK4hxv4Pbi5hloYAZ1B2+0eQchEryBFezLKYOHhVGV/5+H4i0oxng94w==", + "requires": { + "debug": "*", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "*", + "sprintf-js": "^1.1.2" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -982,6 +995,16 @@ "pify": "^3.0.0" } }, + "make-plural": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz", + "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==" + }, + "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==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -992,6 +1015,36 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "messageformat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", + "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", + "requires": { + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" + }, + "dependencies": { + "make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "messageformat-formatters": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", + "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==" + }, + "messageformat-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", + "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==" + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -1045,6 +1098,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mustache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz", + "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==" + }, "mysql": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", @@ -1686,6 +1744,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, "sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", diff --git a/package.json b/package.json index 93d0dbbfb825eede9601ef7dd89cf91ec70690f9..2c3a256225dfdd55c4ad54c364b6e4d650af6004 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "express-flash": "0.0.2", "express-session": "^1.17.0", "fs": "0.0.1-security", + "i18n": "^0.8.5", "morgan": "^1.9.1", "mysql": "^2.17.1", "nodemailer": "^6.3.1", diff --git a/routes/routes.js b/routes/routes.js index b0e32625059268f0d2e5ec77087478188f6f001b..c55b88e1c380a178c80be47804e5cc591b5c8113 100644 --- a/routes/routes.js +++ b/routes/routes.js @@ -11,7 +11,7 @@ const async = require('async') const crypto = require('crypto') const nodemailer = require('nodemailer') -module.exports = function (app, config, passport) { +module.exports = function (app, config, passport, i18n) { // =========== PASSPORT ======= passport.serializeUser(function (user, done) { @@ -54,17 +54,6 @@ module.exports = function (app, config, passport) { passport.use(samlStrategy); - // ============================ -/* - app.all('/', function(req, res){ - req.flash('test', 'it worked'); - res.redirect('/test') - }); - app.all('/test', function(req, res){ - res.send(JSON.stringify(req.flash('test'))); - }); - */ - // ============= SAML ============== app.post(config.passport.saml.path, passport.authenticate(config.passport.strategy, @@ -111,17 +100,34 @@ module.exports = function (app, config, passport) { "We would like to notify that your password has been successfully updated.\n\n"+ "Thanks,\nM4_LAB Team" var updatePasswordMailSubject = "Your M4_LAB Password has been updated" + + // ================ test i18n ================== + i18n.setLocale('de'); + app.get('/de', function(req, res) { + var greeting = i18n.__('Hello World') + res.send(greeting) + }); // ======== APP ROUTES ==================== - app.get('/', function (req, res) { - res.redirect('/profile') + app.get('/account', function (req, res) { + if (req.isAuthenticated()) { + methods.getUserByEmail(req.user.email, function(data, err){ + if (!err) { + res.render('home', { + greeting: i18n.__('Hello'), + }); + } + }) + } else { + res.redirect('/account/login'); + } }); app.get('/error', function (req, res) { res.render('error') }); - app.get('/login', + app.get('/account/login', passport.authenticate(config.passport.strategy, { successRedirect: '/account/', @@ -131,7 +137,7 @@ module.exports = function (app, config, passport) { app.get('/logout', function (req, res) { if (req.user == null) { - return res.redirect('/account/'); + return res.redirect('https://m4lab.hft-stuttgart.de'); } req.user.nameID = req.user.id; @@ -151,7 +157,7 @@ module.exports = function (app, config, passport) { }); }); - app.get('/profile', function (req, res) { + app.get('/account/profile', function (req, res) { if (req.isAuthenticated()) { methods.getUserByEmail(req.user.email, function(data, err){ if (!err) { @@ -166,7 +172,7 @@ module.exports = function (app, config, passport) { } }); - app.get('/services', function (req, res) { + app.get('/account/services', function (req, res) { if (req.isAuthenticated()) { async.waterfall([ // get userId by email from userdb @@ -230,7 +236,7 @@ module.exports = function (app, config, passport) { } }); - app.get('/security', function (req, res) { + app.get('/account/security', function (req, res) { if (req.isAuthenticated()) { res.render('security', { user: req.user // useful for view engine, useless for HTML