mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-08-03 17:19:42 +00:00
This opens up the possibility of putting READMEs or what have you inside locale directories, and will avoid problems if system files or folders end up in the locales.
111 lines
3.4 KiB
JavaScript
111 lines
3.4 KiB
JavaScript
var fs = require('fs'),
|
|
path = require('path'),
|
|
_ = require('lodash'),
|
|
User = require('./models/user').model,
|
|
shared = require('habitrpg-shared'),
|
|
translations = {};
|
|
|
|
var localePath = path.join(__dirname, "/../node_modules/habitrpg-shared/locales/")
|
|
|
|
var loadTranslations = function(locale){
|
|
var files = fs.readdirSync(path.join(localePath, locale));
|
|
translations[locale] = {};
|
|
_.each(files, function(file){
|
|
if(path.extname(file) !== '.json') return;
|
|
_.merge(translations[locale], require(path.join(localePath, locale, file)));
|
|
});
|
|
};
|
|
|
|
// First fetch english so we can merge with missing strings in other languages
|
|
loadTranslations('en');
|
|
|
|
fs.readdirSync(localePath).forEach(function(file) {
|
|
if(file === 'en' || fs.statSync(path.join(localePath, file)).isDirectory() === false) 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){}
|
|
});
|
|
|
|
var getUserLanguage = function(req, res, next){
|
|
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';
|
|
};
|
|
|
|
var getFromUser = function(user){
|
|
var lang;
|
|
if(user && user.preferences.language && translations[user.preferences.language]){
|
|
lang = user.preferences.language;
|
|
}else{
|
|
var preferred = getFromBrowser();
|
|
lang = translations[preferred] ? preferred : 'en';
|
|
}
|
|
req.language = lang;
|
|
next();
|
|
};
|
|
|
|
if(req.locals && req.locals.user){
|
|
getFromUser(req.locals.user);
|
|
}else if(req.session && req.session.userId){
|
|
User.findOne({_id: req.session.userId}, function(err, user){
|
|
if(err) return next(err);
|
|
getFromUser(user);
|
|
});
|
|
}else{
|
|
getFromUser(null);
|
|
}
|
|
};
|
|
|
|
shared.i18n.translations = translations;
|
|
|
|
module.exports = {
|
|
translations: translations,
|
|
avalaibleLanguages: avalaibleLanguages,
|
|
langCodes: langCodes,
|
|
getUserLanguage: getUserLanguage,
|
|
momentLangs: momentLangs
|
|
};
|
|
|
|
|
|
// Export en strings only, temporary solution for mobile
|
|
// This is copied from middleware.js#module.exports.locals#t()
|
|
module.exports.enTranslations = function(){ // stringName and vars are the allowed parameters
|
|
var language = _.find(avalaibleLanguages, {code: 'en'});
|
|
//language.momentLang = ((!isStaticPage && i18n.momentLangs[language.code]) || undefined);
|
|
var args = Array.prototype.slice.call(arguments, 0);
|
|
args.push(language.code);
|
|
return shared.i18n.t.apply(null, args);
|
|
};
|