mirror of
https://github.com/HabitRPG/habitica.git
synced 2026-05-03 19:40:48 -05:00
Respect user language preference in content endpoint
Content API now returns data in user's preferred language when authenticated without language parameter. No breaking changes - existing clients unaffected.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
requester,
|
||||
translate as t,
|
||||
generateUser,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
import i18n from '../../../../../website/common/script/i18n';
|
||||
|
||||
@@ -56,4 +57,28 @@ describe('GET /content', () => {
|
||||
const res = await requester().get('/content?filter=backgroundsFlat,invalid');
|
||||
expect(res).to.not.have.property('backgroundsFlat');
|
||||
});
|
||||
|
||||
describe('authenticated user', () => {
|
||||
let user;
|
||||
it('returns content in user\'s preferred language when no language parameter is provided', async () => {
|
||||
user = await generateUser({ 'preferences.language': 'de' });
|
||||
const res = await user.get('/content');
|
||||
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
|
||||
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de'));
|
||||
});
|
||||
|
||||
it('respects language parameter over user\'s preferred language', async () => {
|
||||
user = await generateUser({ 'preferences.language': 'de' });
|
||||
const res = await user.get('/content?language=fr');
|
||||
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
|
||||
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'fr'));
|
||||
});
|
||||
|
||||
it('falls back to English if user\'s preferred language is invalid', async () => {
|
||||
user = await generateUser({ 'preferences.language': 'invalid_lang' });
|
||||
const res = await user.get('/content');
|
||||
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
|
||||
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText'));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import nconf from 'nconf';
|
||||
import { langCodes } from '../../libs/i18n';
|
||||
import { serveContent } from '../../libs/content';
|
||||
import { authWithHeaders } from '../../middlewares/auth';
|
||||
|
||||
const IS_PROD = nconf.get('IS_PROD');
|
||||
|
||||
@@ -66,12 +67,18 @@ api.getContent = {
|
||||
method: 'GET',
|
||||
url: '/content',
|
||||
noLanguage: true,
|
||||
middlewares: [authWithHeaders({ optional: true })],
|
||||
async handler (req, res) {
|
||||
let language = 'en';
|
||||
const proposedLang = req.query.language;
|
||||
|
||||
if (proposedLang && langCodes.includes(proposedLang)) {
|
||||
language = proposedLang;
|
||||
} else if (res.locals.user && res.locals.user.preferences && res.locals.user.preferences.language) {
|
||||
const userLang = res.locals.user.preferences.language;
|
||||
if (langCodes.includes(userLang)) {
|
||||
language = userLang;
|
||||
}
|
||||
}
|
||||
|
||||
let filter = req.query.filter || '';
|
||||
|
||||
Reference in New Issue
Block a user