summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/gorgeous-foxes-divide.md5
-rw-r--r--packages/astro/e2e/fixtures/i18n/astro.config.mjs4
-rw-r--r--packages/astro/e2e/fixtures/i18n/components/Greeting.astro4
-rw-r--r--packages/astro/e2e/fixtures/i18n/package.json3
-rw-r--r--packages/astro/e2e/fixtures/i18n/src/pages/fr/island.astro5
-rw-r--r--packages/astro/e2e/fixtures/i18n/src/pages/island.astro6
-rw-r--r--packages/astro/e2e/i18n.test.js18
-rw-r--r--packages/astro/src/core/render-context.ts18
-rw-r--r--pnpm-lock.yaml3
9 files changed, 61 insertions, 5 deletions
diff --git a/.changeset/gorgeous-foxes-divide.md b/.changeset/gorgeous-foxes-divide.md
new file mode 100644
index 000000000..2620074bd
--- /dev/null
+++ b/.changeset/gorgeous-foxes-divide.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fixes and issue where `Astro.currentLocale` always returned the default locale when consumed inside a server island.
diff --git a/packages/astro/e2e/fixtures/i18n/astro.config.mjs b/packages/astro/e2e/fixtures/i18n/astro.config.mjs
index 79d2b25f1..170c00451 100644
--- a/packages/astro/e2e/fixtures/i18n/astro.config.mjs
+++ b/packages/astro/e2e/fixtures/i18n/astro.config.mjs
@@ -1,5 +1,5 @@
import { defineConfig } from 'astro/config';
-
+import nodejs from "@astrojs/node"
// https://astro.build/config
export default defineConfig({
i18n: {
@@ -17,4 +17,6 @@ export default defineConfig({
],
}],
},
+ output: 'static',
+ adapter: nodejs({ mode: 'standalone' }),
});
diff --git a/packages/astro/e2e/fixtures/i18n/components/Greeting.astro b/packages/astro/e2e/fixtures/i18n/components/Greeting.astro
new file mode 100644
index 000000000..270fbacf4
--- /dev/null
+++ b/packages/astro/e2e/fixtures/i18n/components/Greeting.astro
@@ -0,0 +1,4 @@
+---
+const locale = Astro.currentLocale
+---
+<p data-testid="greeting">Greeting {locale}!</p>
diff --git a/packages/astro/e2e/fixtures/i18n/package.json b/packages/astro/e2e/fixtures/i18n/package.json
index 3d28c6bf0..fcc349c0a 100644
--- a/packages/astro/e2e/fixtures/i18n/package.json
+++ b/packages/astro/e2e/fixtures/i18n/package.json
@@ -3,6 +3,7 @@
"version": "0.0.0",
"private": true,
"dependencies": {
- "astro": "workspace:*"
+ "astro": "workspace:*",
+ "@astrojs/node": "^8.3.4"
}
}
diff --git a/packages/astro/e2e/fixtures/i18n/src/pages/fr/island.astro b/packages/astro/e2e/fixtures/i18n/src/pages/fr/island.astro
new file mode 100644
index 000000000..5bc26968e
--- /dev/null
+++ b/packages/astro/e2e/fixtures/i18n/src/pages/fr/island.astro
@@ -0,0 +1,5 @@
+---
+import Greeting from "../../../components/Greeting.astro"
+---
+<p>This is a test</p>
+<Greeting server:defer />
diff --git a/packages/astro/e2e/fixtures/i18n/src/pages/island.astro b/packages/astro/e2e/fixtures/i18n/src/pages/island.astro
new file mode 100644
index 000000000..5cb4a2ed9
--- /dev/null
+++ b/packages/astro/e2e/fixtures/i18n/src/pages/island.astro
@@ -0,0 +1,6 @@
+---
+import Greeting from "../../components/Greeting.astro"
+---
+
+<p>This is a test</p>
+<Greeting server:defer />
diff --git a/packages/astro/e2e/i18n.test.js b/packages/astro/e2e/i18n.test.js
index 88d3a0b08..bc86d5a49 100644
--- a/packages/astro/e2e/i18n.test.js
+++ b/packages/astro/e2e/i18n.test.js
@@ -32,3 +32,21 @@ test.describe('i18n', () => {
await expect(p3).toHaveText('Locale: pt-AO');
});
});
+
+test.describe('i18n default locale', () => {
+ test('is "en" when navigating the default locale page', async ({ page, astro }) => {
+ await page.goto(astro.resolveUrl('/island'));
+ let el = page.getByTestId('greeting');
+
+ await expect(el, 'element rendered').toBeVisible();
+ await expect(el).toHaveText('Greeting en!');
+ });
+
+ test('is "fr" when navigating the french page', async ({ page, astro }) => {
+ await page.goto(astro.resolveUrl('/fr/island'));
+ let el = page.getByTestId('greeting');
+
+ await expect(el, 'element rendered').toBeVisible();
+ await expect(el).toHaveText('Greeting fr!');
+ });
+});
diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts
index a4f2b2600..880d1f618 100644
--- a/packages/astro/src/core/render-context.ts
+++ b/packages/astro/src/core/render-context.ts
@@ -29,6 +29,7 @@ import { sequence } from './middleware/index.js';
import { renderRedirect } from './redirects/render.js';
import { type Pipeline, Slots, getParams, getProps } from './render/index.js';
import { copyRequest, setOriginPathname } from './routing/rewrite.js';
+import { SERVER_ISLAND_COMPONENT } from './server-islands/endpoint.js';
export const apiContextRoutesSymbol = Symbol.for('context.routes');
@@ -526,11 +527,22 @@ export class RenderContext {
}
let computedLocale;
- if (routeData.pathname) {
- computedLocale = computeCurrentLocale(routeData.pathname, locales, defaultLocale);
+ if (routeData.component === SERVER_ISLAND_COMPONENT) {
+ let referer = this.request.headers.get('referer');
+ if (referer) {
+ if (URL.canParse(referer)) {
+ referer = new URL(referer).pathname;
+ }
+ computedLocale = computeCurrentLocale(referer, locales, defaultLocale);
+ }
} else {
- computedLocale = computeCurrentLocale(url.pathname, locales, defaultLocale);
+ if (routeData.pathname) {
+ computedLocale = computeCurrentLocale(routeData.pathname, locales, defaultLocale);
+ } else {
+ computedLocale = computeCurrentLocale(url.pathname, locales, defaultLocale);
+ }
}
+
this.#currentLocale = computedLocale ?? fallbackTo;
return this.#currentLocale;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a148ecb12..83c8a8d53 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1038,6 +1038,9 @@ importers:
packages/astro/e2e/fixtures/i18n:
dependencies:
+ '@astrojs/node':
+ specifier: ^8.3.4
+ version: 8.3.4(astro@packages+astro)
astro:
specifier: workspace:*
version: link:../../..