+10
-5
middleware.ts
+10
-5
middleware.ts
···
8
9
// Used when no locale matches
10
defaultLocale: defaultLocale.code,
11
+
12
+
// Always use a Locale as a prefix for routing
13
+
localePrefix: 'always',
14
+
15
+
// We already have our own way of providing alternate links
16
+
// generated on `next.dynamic.mjs`
17
+
alternateLinks: false,
18
});
19
20
+
// We only want the middleware to run on the `/` route
21
+
// to redirect users to their preferred locale
22
+
export const config = { matcher: ['/'] };
+13
-7
next.dynamic.mjs
+13
-7
next.dynamic.mjs
···
218
: siteConfig.title;
219
220
pageMetadata.twitter.title = pageMetadata.title;
221
-
pageMetadata.alternates.canonical = `${baseUrlAndPath}/${locale}/${path}`;
222
223
-
pageMetadata.alternates.languages[
224
-
'x-default'
225
-
] = `${baseUrlAndPath}/${defaultLocale.code}/${path}`;
226
227
availableLocaleCodes.forEach(currentLocale => {
228
-
pageMetadata.alternates.languages[
229
-
currentLocale
230
-
] = `${baseUrlAndPath}/${currentLocale}/${path}`;
231
});
232
233
return pageMetadata;
···
218
: siteConfig.title;
219
220
pageMetadata.twitter.title = pageMetadata.title;
221
222
+
const getUrlForPathname = (l, p) =>
223
+
`${baseUrlAndPath}/${l}${p ? `/${p}` : ''}`;
224
+
225
+
pageMetadata.alternates.canonical = getUrlForPathname(locale, path);
226
+
227
+
pageMetadata.alternates.languages['x-default'] = getUrlForPathname(
228
+
defaultLocale.code,
229
+
path
230
+
);
231
232
availableLocaleCodes.forEach(currentLocale => {
233
+
pageMetadata.alternates.languages[currentLocale] = getUrlForPathname(
234
+
currentLocale,
235
+
path
236
+
);
237
});
238
239
return pageMetadata;