diff --git a/.changeset/thirty-drinks-shout.md b/.changeset/thirty-drinks-shout.md new file mode 100644 index 000000000000..815e14dc144d --- /dev/null +++ b/.changeset/thirty-drinks-shout.md @@ -0,0 +1,6 @@ +--- +'astro': patch +'create-astro': patch +--- + +Fix [#3309](https://github.com/withastro/astro/issues/3309) default logger locale behavior. diff --git a/packages/astro/src/core/logger/core.ts b/packages/astro/src/core/logger/core.ts index bfe5287f365a..46045fd81155 100644 --- a/packages/astro/src/core/logger/core.ts +++ b/packages/astro/src/core/logger/core.ts @@ -14,18 +14,16 @@ export interface LogOptions { level: LoggerLevel; } -function getLoggerLocale(): string { - const defaultLocale = 'en-US'; - if (process.env.LANG) { - const extractedLocale = process.env.LANG.split('.')[0].replace(/_/g, '-'); - // Check if language code is atleast two characters long (ie. en, es). - // NOTE: if "c" locale is encountered, the default locale will be returned. - if (extractedLocale.length < 2) return defaultLocale; - else return extractedLocale.substring(0, 5); - } else return defaultLocale; -} - -export const dateTimeFormat = new Intl.DateTimeFormat(getLoggerLocale(), { +// Hey, locales are pretty complicated! Be careful modifying this logic... +// If we throw at the top-level, international users can't use Astro. +// +// Using `[]` sets the default locale properly from the system! +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#parameters +// +// Here be the dragons we've slain: +// https://github.com/withastro/astro/issues/2625 +// https://github.com/withastro/astro/issues/3309 +export const dateTimeFormat = new Intl.DateTimeFormat([], { hour: '2-digit', minute: '2-digit', second: '2-digit', diff --git a/packages/astro/test/cli.test.js b/packages/astro/test/cli.test.js index 369c1210330e..480a530d0c37 100644 --- a/packages/astro/test/cli.test.js +++ b/packages/astro/test/cli.test.js @@ -110,3 +110,21 @@ describe('astro cli', () => { }); }); }); + +describe('astro cli i18n', () => { + const LOCALES = ['en_US', 'sv_SE', 'es_419.UTF-8', 'es_ES@euro', 'C']; + LOCALES.forEach((locale) => { + it(`astro does NOT throw on "${locale}" locales`, async () => { + const projectRootURL = new URL('./fixtures/astro-basic/', import.meta.url); + let error = null; + try { + const proc = cli('dev', '--root', fileURLToPath(projectRootURL), { env: { LANG: locale }}); + await parseCliDevStart(proc) + } catch (e) { + console.log(e); + error = e.message; + } + expect(error).to.be.null; + }); + }) +}) diff --git a/packages/create-astro/src/logger.ts b/packages/create-astro/src/logger.ts index 65f354632c00..96965e7ea03a 100644 --- a/packages/create-astro/src/logger.ts +++ b/packages/create-astro/src/logger.ts @@ -6,20 +6,19 @@ type ConsoleStream = Writable & { fd: 1 | 2; }; -function getLoggerLocale(): string { - const defaultLocale = 'en-US'; - if (process.env.LANG) { - const extractedLocale = process.env.LANG.split('.')[0].replace(/_/g, '-'); - // Check if language code is atleast two characters long (ie. en, es). - // NOTE: if "c" locale is encountered, the default locale will be returned. - if (extractedLocale.length < 2) return defaultLocale; - else return extractedLocale; - } else return defaultLocale; -} - -const dt = new Intl.DateTimeFormat(getLoggerLocale(), { +// Hey, locales are pretty complicated! Be careful modifying this logic... +// If we throw at the top-level, international users can't use Astro. +// +// Using `[]` sets the default locale properly from the system! +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#parameters +// +// Here be the dragons we've slain: +// https://github.com/withastro/astro/issues/2625 +// https://github.com/withastro/astro/issues/3309 +const dt = new Intl.DateTimeFormat([], { hour: '2-digit', minute: '2-digit', + second: '2-digit', }); export const defaultLogDestination = new Writable({