summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/happy-pianos-report.md5
-rw-r--r--packages/astro/src/core/render-context.ts13
-rw-r--r--packages/astro/test/fixtures/i18n-routing-fallback/src/pages/index.astro7
-rw-r--r--packages/astro/test/i18n-routing.test.js7
4 files changed, 28 insertions, 4 deletions
diff --git a/.changeset/happy-pianos-report.md b/.changeset/happy-pianos-report.md
new file mode 100644
index 000000000..5e10b02a6
--- /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 3e0637ed8..7f173a1de 100644
--- a/packages/astro/src/core/render-context.ts
+++ b/packages/astro/src/core/render-context.ts
@@ -605,8 +605,17 @@ 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
+ let pathname = routeData.pathname;
+ if (!routeData.pattern.test(url.pathname)) {
+ for (const fallbackRoute of routeData.fallbackRoutes) {
+ if (fallbackRoute.pattern.test(url.pathname)) {
+ pathname = fallbackRoute.pathname;
+ break;
+ }
+ }
+ }
+ pathname = pathname && !isRoute404or500(routeData) ? 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 34b39fcd6..c2965ac81 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
+---
<html>
<head>
<title>Astro</title>
@@ -7,6 +10,10 @@
</head>
<body>
Hello
+ <p>
+
+ locale - {locale}
+ </p>
</body>
</html>
diff --git a/packages/astro/test/i18n-routing.test.js b/packages/astro/test/i18n-routing.test.js
index 8075d7e52..9d98a8cf0 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/);
});