From 6c92b6b33feff5b85d06bea3e0b5cb4d09ebf99a Mon Sep 17 00:00:00 2001 From: Afzal Momin Date: Thu, 4 Dec 2025 23:45:07 +0530 Subject: [PATCH 1/2] set accept language request header for selected language --- src/utils/url.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/utils/url.ts b/src/utils/url.ts index 8da88eed..a03dc81a 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -222,7 +222,7 @@ export function makeHeader(token?: string) { const out: AxiosRequestConfig['headers'] = {}; out['Content-Type'] = 'application/json'; - + out['Accept-Language'] = getAcceptLanguage(); if (token) { out['Authorization'] = `Token ${token}`; } @@ -231,7 +231,16 @@ export function makeHeader(token?: string) { if (IS_PROD && csrfCookie != undefined) { out['X-CSRFToken'] = csrfCookie; } - return out; } +export function getAcceptLanguage():string{ +const languages = navigator.languages || []; // get language preference from user's browser settings +if (languages.length === 0) { + return 'en-US,en;'; //fallback + } + +return languages.map((language,_)=>{ + return language; +}).join(','); +} \ No newline at end of file From ef6224ba210785876cdcae7a222d62d13e44f43e Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Thu, 15 Jan 2026 12:33:49 +0100 Subject: [PATCH 2/2] Use the selected language from i18n This changes based on what the user selected via the UI, while the browser settings always remain the same. --- src/utils/url.test.ts | 33 ++++++++++++++++++++++++++++++++- src/utils/url.ts | 17 +++++++++-------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/utils/url.test.ts b/src/utils/url.test.ts index d2ce719f..9fcf9a04 100644 --- a/src/utils/url.test.ts +++ b/src/utils/url.test.ts @@ -1,4 +1,5 @@ -import { makeHeader, makeLink, makeUrl, WgerLink } from "utils/url"; +import i18n from "i18n"; +import { getAcceptLanguage, makeHeader, makeLink, makeUrl, WgerLink } from "utils/url"; describe("test url utility", () => { @@ -67,6 +68,7 @@ describe("test the header utility", () => { test('generate header', () => { const result = makeHeader('123'); expect(result).toStrictEqual({ + 'Accept-Language': 'en', 'Authorization': `Token 123`, 'Content-Type': 'application/json', }); @@ -75,6 +77,7 @@ describe("test the header utility", () => { test('generate header - token from config', () => { const result = makeHeader(); expect(result).toStrictEqual({ + 'Accept-Language': 'en', 'Authorization': `Token 122333444455555666666`, 'Content-Type': 'application/json', }); @@ -123,5 +126,33 @@ describe("test the makeLink helper", () => { const result = makeLink(WgerLink.WEIGHT_OVERVIEW, 'de',); expect(result).toEqual('/de/weight/overview'); }); +}); + +describe("test the getAcceptLanguage helper", () => { + + beforeEach(() => { + // @ts-expect-error - test helper assignment + i18n.languages = undefined; + }); + + test("returns default when languages is undefined", () => { + // @ts-expect-error - test helper assignment + i18n.languages = undefined; + expect(getAcceptLanguage()).toBe("en"); + }); + test("returns default when languages is an empty array", () => { + i18n.languages = []; + expect(getAcceptLanguage()).toBe("en"); + }); + + test("returns single language code", () => { + i18n.languages = ["de"]; + expect(getAcceptLanguage()).toBe("de"); + }); + + test("joins multiple language codes with comma", () => { + i18n.languages = ["de-DE", "fr-FR"]; + expect(getAcceptLanguage()).toBe("de-DE, fr-FR"); + }); }); diff --git a/src/utils/url.ts b/src/utils/url.ts index a03dc81a..6fa6eb77 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -1,5 +1,6 @@ import { AxiosRequestConfig } from "axios"; import { IS_PROD, VITE_API_KEY, VITE_API_SERVER } from "config"; +import i18n from "i18n"; import slug from "slug"; interface makeUrlInterface { @@ -234,13 +235,13 @@ export function makeHeader(token?: string) { return out; } -export function getAcceptLanguage():string{ -const languages = navigator.languages || []; // get language preference from user's browser settings -if (languages.length === 0) { - return 'en-US,en;'; //fallback - } +export function getAcceptLanguage(): string { + const languages = i18n.languages || []; + if (languages.length === 0) { + return 'en'; + } -return languages.map((language,_)=>{ - return language; -}).join(','); + return languages.map((language) => { + return language; + }).join(', '); } \ No newline at end of file