diff --git a/.changeset/happy-pianos-report.md b/.changeset/happy-pianos-report.md new file mode 100644 index 000000000000..5e10b02a6671 --- /dev/null +++ b/.changeset/happy-pianos-report.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fix Astro.currentLocale returning the incorrect locale when using fallback rewrites in SSR mode diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index e001461593e2..dd75f101c65f 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -591,8 +591,14 @@ export class RenderContext { computedLocale = computeCurrentLocale(referer, locales, defaultLocale); } } else { - const pathname = - routeData.pathname && !isRoute404or500(routeData) ? routeData.pathname : url.pathname; + // For SSG we match the route naively, for dev we handle fallback on 404, for SSR we find route from fallbackRoutes + const route = + (routeData.pattern.test(url.pathname) + ? routeData + : routeData.fallbackRoutes.find((fallbackRoute) => + fallbackRoute.pattern.test(url.pathname), + )) ?? routeData; + const pathname = route.pathname && !isRoute404or500(route) ? route.pathname : url.pathname; computedLocale = computeCurrentLocale(pathname, locales, defaultLocale); } diff --git a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/index.astro b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/index.astro index 34b39fcd6747..c2965ac81262 100644 --- a/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/index.astro +++ b/packages/astro/test/fixtures/i18n-routing-fallback/src/pages/index.astro @@ -1,3 +1,6 @@ +--- +const locale = Astro.currentLocale +--- Astro @@ -7,6 +10,10 @@ Hello +

+ + locale - {locale} +

diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js index 8075d7e52d49..9d98a8cf0016 100644 --- a/packages/astro/test/i18n-routing.test.js +++ b/packages/astro/test/i18n-routing.test.js @@ -1,6 +1,6 @@ +import * as cheerio from 'cheerio'; import * as assert from 'node:assert/strict'; import { after, afterEach, before, describe, it } from 'node:test'; -import * as cheerio from 'cheerio'; import testAdapter from './test-adapter.js'; import { loadFixture } from './test-utils.js'; @@ -2014,13 +2014,13 @@ describe('Fallback rewrite dev server', () => { locales: ['en', 'fr', 'es', 'it', 'pt'], routing: { prefixDefaultLocale: false, + fallbackType: 'rewrite', }, fallback: { fr: 'en', it: 'en', es: 'pt', }, - fallbackType: 'rewrite', }, }); devServer = await fixture.startDevServer(); @@ -2032,6 +2032,7 @@ describe('Fallback rewrite dev server', () => { it('should correctly rewrite to en', async () => { const html = await fixture.fetch('/fr').then((res) => res.text()); assert.match(html, /Hello/); + assert.match(html, /locale - fr/); // assert.fail() }); @@ -2085,6 +2086,7 @@ describe('Fallback rewrite SSG', () => { it('should correctly rewrite to en', async () => { const html = await fixture.readFile('/fr/index.html'); assert.match(html, /Hello/); + assert.match(html, /locale - fr/); // assert.fail() }); @@ -2138,6 +2140,7 @@ describe('Fallback rewrite SSR', () => { const response = await app.render(request); assert.equal(response.status, 200); const html = await response.text(); + assert.match(html, /locale - fr/); assert.match(html, /Hello/); });