mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
Deprecate API v2 (#7761)
* deprecate api-v2 * remove v2 test helpers * remove unused string
This commit is contained in:
91
website/server/middlewares/language.js
Normal file
91
website/server/middlewares/language.js
Normal file
@@ -0,0 +1,91 @@
|
||||
import { model as User } from '../models/user';
|
||||
import accepts from 'accepts';
|
||||
import common from '../../../common';
|
||||
import _ from 'lodash';
|
||||
import {
|
||||
translations,
|
||||
defaultLangCodes,
|
||||
multipleVersionsLanguages,
|
||||
} from '../libs/i18n';
|
||||
|
||||
const i18n = common.i18n;
|
||||
|
||||
function _getUniqueListOfLanguages (languages) {
|
||||
let acceptableLanguages = _(languages).map((lang) => {
|
||||
return lang.slice(0, 2);
|
||||
}).uniq().value();
|
||||
|
||||
let uniqueListOfLanguages = _.intersection(acceptableLanguages, defaultLangCodes);
|
||||
|
||||
return uniqueListOfLanguages;
|
||||
}
|
||||
|
||||
function _checkForApplicableLanguageVariant (originalLanguageOptions) {
|
||||
let languageVariant = _.find(originalLanguageOptions, (accepted) => {
|
||||
let trimmedAccepted = accepted.slice(0, 2);
|
||||
|
||||
return multipleVersionsLanguages[trimmedAccepted];
|
||||
});
|
||||
|
||||
return languageVariant;
|
||||
}
|
||||
|
||||
function _getFromBrowser (req) {
|
||||
let originalLanguageOptions = accepts(req).languages();
|
||||
let uniqueListOfLanguages = _getUniqueListOfLanguages(originalLanguageOptions);
|
||||
let baseLanguage = (uniqueListOfLanguages[0] || '').toLowerCase();
|
||||
let languageMapping = multipleVersionsLanguages[baseLanguage];
|
||||
|
||||
if (languageMapping) {
|
||||
let languageVariant = _checkForApplicableLanguageVariant(originalLanguageOptions);
|
||||
|
||||
if (languageVariant) {
|
||||
languageVariant = languageVariant.toLowerCase();
|
||||
} else {
|
||||
return 'en';
|
||||
}
|
||||
|
||||
return languageMapping[languageVariant] || baseLanguage;
|
||||
} else {
|
||||
return baseLanguage || 'en';
|
||||
}
|
||||
}
|
||||
|
||||
function _getFromUser (user, req) {
|
||||
let preferredLang = user && user.preferences && user.preferences.language;
|
||||
let lang = translations[preferredLang] ? preferredLang : _getFromBrowser(req);
|
||||
|
||||
return lang;
|
||||
}
|
||||
|
||||
export function attachTranslateFunction (req, res, next) {
|
||||
res.t = function reqTranslation () {
|
||||
return i18n.t(...arguments, req.language);
|
||||
};
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
export function getUserLanguage (req, res, next) {
|
||||
if (req.query.lang) { // In case the language is specified in the request url, use it
|
||||
req.language = translations[req.query.lang] ? req.query.lang : 'en';
|
||||
return next();
|
||||
} else if (req.locals && req.locals.user) { // If the request is authenticated, use the user's preferred language
|
||||
req.language = _getFromUser(req.locals.user, req);
|
||||
return next();
|
||||
} else if (req.session && req.session.userId) { // Same thing if the user has a valid session
|
||||
return User.findOne({
|
||||
_id: req.session.userId,
|
||||
}, 'preferences.language')
|
||||
.lean()
|
||||
.exec()
|
||||
.then((user) => {
|
||||
req.language = _getFromUser(user, req);
|
||||
return next();
|
||||
})
|
||||
.catch(next);
|
||||
} else { // Otherwise get from browser
|
||||
req.language = _getFromUser(null, req);
|
||||
return next();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user