2014-03-05 15:43:00 +00:00
|
|
|
var fs = require('fs'),
|
|
|
|
|
path = require('path'),
|
|
|
|
|
_ = require('lodash'),
|
|
|
|
|
User = require('./models/user').model,
|
|
|
|
|
shared = require('habitrpg-shared'),
|
|
|
|
|
translations = {};
|
|
|
|
|
|
|
|
|
|
var loadTranslations = function(locale){
|
|
|
|
|
var files = fs.readdirSync(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/", locale));
|
|
|
|
|
translations[locale] = {};
|
|
|
|
|
_.each(files, function(file){
|
|
|
|
|
_.merge(translations[locale], require(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/", locale, file)));
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// First fetch english so we can merge with missing strings in other languages
|
|
|
|
|
loadTranslations('en');
|
|
|
|
|
|
|
|
|
|
fs.readdirSync(path.join(__dirname, "/../node_modules/habitrpg-shared/locales/")).forEach(function(file) {
|
|
|
|
|
if(file === 'en' || file === 'README.md') return;
|
|
|
|
|
loadTranslations(file);
|
|
|
|
|
// Merge missing strings from english
|
|
|
|
|
_.defaults(translations[file], translations.en);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var langCodes = Object.keys(translations);
|
|
|
|
|
|
|
|
|
|
var avalaibleLanguages = _.map(langCodes, function(langCode){
|
|
|
|
|
return {
|
|
|
|
|
code: langCode,
|
|
|
|
|
name: translations[langCode].languageName
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Load MomentJS localization files
|
|
|
|
|
var momentLangs = {};
|
|
|
|
|
|
|
|
|
|
// Handle different language codes from MomentJS and /locales
|
|
|
|
|
var momentLangsMapping = {
|
|
|
|
|
'en': 'en-gb',
|
|
|
|
|
'no': 'nn'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var momentLangs = {};
|
|
|
|
|
|
|
|
|
|
_.each(langCodes, function(code){
|
|
|
|
|
var lang = _.find(avalaibleLanguages, {code: code});
|
|
|
|
|
lang.momentLangCode = (momentLangsMapping[code] || code);
|
|
|
|
|
try{
|
|
|
|
|
// MomentJS lang files are JS files that has to be executed in the browser so we load them as plain text files
|
|
|
|
|
var f = fs.readFileSync(path.join(__dirname, '/../node_modules/moment/lang/' + lang.momentLangCode + '.js'), 'utf8');
|
|
|
|
|
momentLangs[code] = f;
|
|
|
|
|
}catch (e){}
|
|
|
|
|
});
|
|
|
|
|
|
2014-03-10 16:28:49 +00:00
|
|
|
var getUserLanguage = function(req, res, next){
|
2014-03-05 15:43:00 +00:00
|
|
|
var getFromBrowser = function(){
|
|
|
|
|
var acceptable = _(req.acceptedLanguages).map(function(lang){
|
|
|
|
|
return lang.slice(0, 2);
|
|
|
|
|
}).uniq().value();
|
|
|
|
|
var matches = _.intersection(acceptable, langCodes);
|
|
|
|
|
return matches.length > 0 ? matches[0] : 'en';
|
|
|
|
|
};
|
|
|
|
|
|
2014-03-10 16:28:49 +00:00
|
|
|
var getFromUser = function(user){
|
|
|
|
|
var lang;
|
|
|
|
|
if(user && user.preferences.language && translations[user.preferences.language]){
|
2014-03-10 18:36:07 +00:00
|
|
|
lang = user.preferences.language;
|
2014-03-10 16:28:49 +00:00
|
|
|
}else{
|
2014-03-10 18:36:07 +00:00
|
|
|
var preferred = getFromBrowser();
|
|
|
|
|
lang = translations[preferred] ? preferred : 'en';
|
2014-03-10 16:28:49 +00:00
|
|
|
}
|
|
|
|
|
req.language = lang;
|
|
|
|
|
next();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if(req.locals && req.locals.user){
|
|
|
|
|
getFromUser(req.locals.user);
|
|
|
|
|
}else if(req.session && req.session.userId){
|
2014-03-05 15:43:00 +00:00
|
|
|
User.findOne({_id: req.session.userId}, function(err, user){
|
|
|
|
|
if(err) return callback(err);
|
2014-03-10 16:28:49 +00:00
|
|
|
getFromUser(user);
|
2014-03-05 15:43:00 +00:00
|
|
|
});
|
|
|
|
|
}else{
|
2014-03-10 16:28:49 +00:00
|
|
|
getFromUser(null);
|
2014-03-05 15:43:00 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
shared.i18n.translations = translations;
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
translations: translations,
|
|
|
|
|
avalaibleLanguages: avalaibleLanguages,
|
|
|
|
|
langCodes: langCodes,
|
|
|
|
|
getUserLanguage: getUserLanguage,
|
|
|
|
|
momentLangs: momentLangs
|
|
|
|
|
};
|