diff --git a/apps/web/src/common/utils/time.test.ts b/apps/web/src/common/utils/time.test.ts index 8479d4647..53af55310 100644 --- a/apps/web/src/common/utils/time.test.ts +++ b/apps/web/src/common/utils/time.test.ts @@ -21,3 +21,21 @@ describe('time', () => { expect(formatToNowStrict('2022-09-28T02:11:54Z')).toBe('2 months'); }); }); + +describe('time locale', () => { + it('follows the locale that is active at call time', () => { + let locale = 'en'; + jest.isolateModules(() => { + jest.doMock('@common/utils/getLocale', () => ({ + __esModule: true, + default: () => locale, + })); + const mod = require('./time'); + const en = mod.formatToNow('2022-09-28T02:11:54Z'); + locale = 'zh'; + const zh = mod.formatToNow('2022-09-28T02:11:54Z'); + expect(en).toContain('about'); + expect(zh).not.toEqual(en); + }); + }); +}); diff --git a/apps/web/src/common/utils/time.ts b/apps/web/src/common/utils/time.ts index fce7917ae..69a4a3d10 100644 --- a/apps/web/src/common/utils/time.ts +++ b/apps/web/src/common/utils/time.ts @@ -8,8 +8,10 @@ import { enGB, zhCN } from 'date-fns/locale'; import getLocale from '@common/utils/getLocale'; const FORMAT_YMD = 'yyyy-MM-dd'; -const local = getLocale(); const languages = { en: enGB, zh: zhCN }; +// Read the locale at call time: capturing it in a module-level constant froze the +// date language for the lifetime of the bundle. +const currentLocale = () => languages[getLocale()]; export const formatISO = (s: string, layout?: string) => { if (!s) return ''; @@ -20,13 +22,13 @@ export const formatISO = (s: string, layout?: string) => { export const formatToNow = (s: string) => { if (!s) return ''; const p = parseJSON(s); - return formatDistanceToNow(p, { locale: languages[local] }); + return formatDistanceToNow(p, { locale: currentLocale() }); }; export const formatToNowStrict = (s: string) => { if (!s) return ''; const p = parseJSON(s); - return formatDistanceToNowStrict(p, { locale: languages[local] }); + return formatDistanceToNowStrict(p, { locale: currentLocale() }); }; export const isTimestampWithinSec = (ts: string, sec: number): boolean => {