0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-04-07 23:41:43 -05:00

fix(i18n): move transformation outside the user schema (#10169)

* fix(i18n): move transformation outside the user schema

* fix condition

* cleanup

* ops

* fix regression
This commit is contained in:
Emanuele Stoppa 2024-02-21 07:42:06 +00:00 committed by GitHub
parent aa5efd1bb2
commit a46249173e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 229 additions and 191 deletions

View file

@ -0,0 +1,5 @@
---
"astro": patch
---
Fixes an issue with the `i18n.routing` types, where an internal transformation was causing the generation of incorrect types for integrations.

View file

@ -166,9 +166,9 @@ export class App {
if (
this.#manifest.i18n &&
(this.#manifest.i18n.routing === 'domains-prefix-always' ||
this.#manifest.i18n.routing === 'domains-prefix-other-locales' ||
this.#manifest.i18n.routing === 'domains-prefix-always-no-redirect')
(this.#manifest.i18n.strategy === 'domains-prefix-always' ||
this.#manifest.i18n.strategy === 'domains-prefix-other-locales' ||
this.#manifest.i18n.strategy === 'domains-prefix-always-no-redirect')
) {
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host
let host = request.headers.get('X-Forwarded-Host');

View file

@ -8,7 +8,7 @@ import type {
SSRResult,
} from '../../@types/astro.js';
import type { SinglePageBuiltModule } from '../build/types.js';
import type { RoutingStrategies } from '../config/schema.js';
import type { RoutingStrategies } from '../../i18n/utils.js';
export type ComponentPath = string;
@ -60,7 +60,7 @@ export type SSRManifest = {
export type SSRManifestI18n = {
fallback?: Record<string, string>;
routing: RoutingStrategies;
strategy: RoutingStrategies;
locales: Locales;
defaultLocale: string;
domainLookupTable: Record<string, string>;

View file

@ -60,6 +60,7 @@ import type {
import { getTimeStat, shouldAppendForwardSlash } from './util.js';
import { NoPrerenderedRoutesWithDomains } from '../errors/errors-data.js';
import { RenderContext } from '../render-context.js';
import { toRoutingStrategy } from '../../i18n/utils.js';
function createEntryURL(filePath: string, outFolder: URL) {
return new URL('./' + filePath + `?time=${Date.now()}`, outFolder);
@ -582,7 +583,7 @@ function createBuildManifest(
if (settings.config.i18n) {
i18nManifest = {
fallback: settings.config.i18n.fallback,
routing: settings.config.i18n.routing,
strategy: toRoutingStrategy(settings.config.i18n),
defaultLocale: settings.config.i18n.defaultLocale,
locales: settings.config.i18n.locales,
domainLookupTable: {},

View file

@ -17,6 +17,7 @@ import { cssOrder, mergeInlineCss, type BuildInternals } from '../internal.js';
import type { AstroBuildPlugin } from '../plugin.js';
import type { StaticBuildOptions } from '../types.js';
import { normalizeTheLocale } from '../../../i18n/index.js';
import { toRoutingStrategy } from '../../../i18n/utils.js';
const manifestReplace = '@@ASTRO_MANIFEST_REPLACE@@';
const replaceExp = new RegExp(`['"]${manifestReplace}['"]`, 'g');
@ -235,14 +236,7 @@ function buildManifest(
* logic meant for i18n domain support, where we fill the lookup table
*/
const i18n = settings.config.i18n;
if (
settings.config.experimental.i18nDomains &&
i18n &&
i18n.domains &&
(i18n.routing === 'domains-prefix-always' ||
i18n.routing === 'domains-prefix-other-locales' ||
i18n.routing === 'domains-prefix-always-no-redirect')
) {
if (settings.config.experimental.i18nDomains && i18n && i18n.domains) {
for (const [locale, domainValue] of Object.entries(i18n.domains)) {
domainLookupTable[domainValue] = normalizeTheLocale(locale);
}
@ -257,7 +251,7 @@ function buildManifest(
if (settings.config.i18n) {
i18nManifest = {
fallback: settings.config.i18n.fallback,
routing: settings.config.i18n.routing,
strategy: toRoutingStrategy(settings.config.i18n),
locales: settings.config.i18n.locales,
defaultLocale: settings.config.i18n.defaultLocale,
domainLookupTable,

View file

@ -66,14 +66,6 @@ const ASTRO_CONFIG_DEFAULTS = {
},
} satisfies AstroUserConfig & { server: { open: boolean } };
export type RoutingStrategies =
| 'pathname-prefix-always'
| 'pathname-prefix-other-locales'
| 'pathname-prefix-always-no-redirect'
| 'domains-prefix-always'
| 'domains-prefix-other-locales'
| 'domains-prefix-always-no-redirect';
export const AstroConfigSchema = z.object({
root: z
.string()
@ -363,37 +355,6 @@ export const AstroConfigSchema = z.object({
),
})
.optional()
.transform((i18n) => {
if (i18n) {
let { routing, domains } = i18n;
let strategy: RoutingStrategies;
const hasDomains = domains ? Object.keys(domains).length > 0 : false;
if (!hasDomains) {
if (routing.prefixDefaultLocale === true) {
if (routing.redirectToDefaultLocale) {
strategy = 'pathname-prefix-always';
} else {
strategy = 'pathname-prefix-always-no-redirect';
}
} else {
strategy = 'pathname-prefix-other-locales';
}
} else {
if (routing.prefixDefaultLocale === true) {
if (routing.redirectToDefaultLocale) {
strategy = 'domains-prefix-always';
} else {
strategy = 'domains-prefix-always-no-redirect';
}
} else {
strategy = 'domains-prefix-other-locales';
}
}
return { ...i18n, routing: strategy };
}
return undefined;
})
.superRefine((i18n, ctx) => {
if (i18n) {
const { defaultLocale, locales: _locales, fallback, domains, routing } = i18n;
@ -436,20 +397,15 @@ export const AstroConfigSchema = z.object({
}
if (domains) {
const entries = Object.entries(domains);
if (entries.length > 0) {
if (
routing !== 'domains-prefix-other-locales' &&
routing !== 'domains-prefix-always-no-redirect' &&
routing !== 'domains-prefix-always'
) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `When specifying some domains, the property \`i18n.routingStrategy\` must be set to \`"domains"\`.`,
});
}
const hasDomains = domains ? Object.keys(domains).length > 0 : false;
if (entries.length > 0 && !hasDomains) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `When specifying some domains, the property \`i18n.routingStrategy\` must be set to \`"domains"\`.`,
});
}
for (const [domainKey, domainValue] of Object.entries(domains)) {
for (const [domainKey, domainValue] of entries) {
if (!locales.includes(domainKey)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
@ -625,11 +581,8 @@ export function createRelativeSchema(cmd: string, fileProtocolRoot: string) {
.superRefine((configuration, ctx) => {
const { site, experimental, i18n, output } = configuration;
if (experimental.i18nDomains) {
if (
i18n?.routing === 'domains-prefix-other-locales' ||
i18n?.routing === 'domains-prefix-always-no-redirect' ||
i18n?.routing === 'domains-prefix-always'
) {
const hasDomains = i18n?.domains ? Object.keys(i18n.domains).length > 0 : false;
if (hasDomains) {
if (!site) {
ctx.addIssue({
code: z.ZodIssueCode.custom,

View file

@ -6,8 +6,8 @@ import {
computeCurrentLocale,
computePreferredLocale,
computePreferredLocaleList,
type RoutingStrategies,
} from '../../i18n/utils.js';
import type { RoutingStrategies } from '../config/schema.js';
type CreateAPIContext = {
request: Request;

View file

@ -190,7 +190,7 @@ export class RenderContext {
const { links, scripts, styles } = await pipeline.headElements(routeData);
const componentMetadata =
(await pipeline.componentMetadata(routeData)) ?? manifest.componentMetadata;
const { defaultLocale, locales, routing: routingStrategy } = i18n ?? {};
const { defaultLocale, locales, strategy } = i18n ?? {};
const partial = Boolean(mod.partial);
return createResult({
adapterName,
@ -210,7 +210,7 @@ export class RenderContext {
resolve,
request,
route: routeData.route,
routingStrategy,
strategy,
site,
scripts,
ssr: serverLike,
@ -238,9 +238,9 @@ export class RenderContext {
preferredLocale: undefined,
preferredLocaleList: undefined,
};
const { defaultLocale, locales, routing } = i18n;
const { defaultLocale, locales, strategy } = i18n;
return (this.#i18nData = {
currentLocale: computeCurrentLocale(routeData.route, locales, routing, defaultLocale),
currentLocale: computeCurrentLocale(routeData.route, locales, strategy, defaultLocale),
preferredLocale: computePreferredLocale(request, locales),
preferredLocaleList: computePreferredLocaleList(request, locales),
});

View file

@ -17,8 +17,8 @@ import {
computeCurrentLocale,
computePreferredLocale,
computePreferredLocaleList,
type RoutingStrategies,
} from '../../i18n/utils.js';
import type { RoutingStrategies } from '../config/schema.js';
import { clientAddressSymbol, responseSentSymbol } from '../constants.js';
export interface CreateResultArgs {
@ -53,7 +53,7 @@ export interface CreateResultArgs {
locales: Locales | undefined;
defaultLocale: string | undefined;
route: string;
routingStrategy: RoutingStrategies | undefined;
strategy: RoutingStrategies | undefined;
}
function getFunctionExpression(slot: any) {
@ -234,7 +234,7 @@ export function createResult(args: CreateResultArgs): SSRResult {
currentLocale = computeCurrentLocale(
url.pathname,
args.locales,
args.routingStrategy,
args.strategy,
args.defaultLocale
);
if (currentLocale) {

View file

@ -20,6 +20,7 @@ import { AstroError } from '../../errors/index.js';
import { removeLeadingForwardSlash, slash } from '../../path.js';
import { resolvePages } from '../../util.js';
import { getRouteGenerator } from './generator.js';
import { toRoutingStrategy } from '../../../i18n/utils.js';
const require = createRequire(import.meta.url);
interface Item {
@ -686,8 +687,9 @@ export function createRouteManifest(
const i18n = settings.config.i18n;
if (i18n) {
const strategy = toRoutingStrategy(i18n);
// First we check if the user doesn't have an index page.
if (i18n.routing === 'pathname-prefix-always') {
if (strategy === 'pathname-prefix-always') {
let index = routes.find((route) => route.route === '/');
if (!index) {
let relativePath = path.relative(
@ -755,7 +757,7 @@ export function createRouteManifest(
// Work done, now we start creating "fallback" routes based on the configuration
if (i18n.routing === 'pathname-prefix-always') {
if (strategy === 'pathname-prefix-always') {
// we attempt to retrieve the index page of the default locale
const defaultLocaleRoutes = routesByLocale.get(i18n.defaultLocale);
if (defaultLocaleRoutes) {
@ -830,7 +832,7 @@ export function createRouteManifest(
let route: string;
if (
fallbackToLocale === i18n.defaultLocale &&
i18n.routing === 'pathname-prefix-other-locales'
strategy === 'pathname-prefix-other-locales'
) {
if (fallbackToRoute.pathname) {
pathname = `/${fallbackFromLocale}${fallbackToRoute.pathname}`;

View file

@ -3,7 +3,7 @@ import type { AstroConfig, Locales } from '../@types/astro.js';
import { shouldAppendForwardSlash } from '../core/build/util.js';
import { MissingLocale } from '../core/errors/errors-data.js';
import { AstroError } from '../core/errors/index.js';
import type { RoutingStrategies } from '../core/config/schema.js';
import type { RoutingStrategies } from './utils.js';
type GetLocaleRelativeUrl = GetLocaleOptions & {
locale: string;
@ -11,7 +11,7 @@ type GetLocaleRelativeUrl = GetLocaleOptions & {
locales: Locales;
trailingSlash: AstroConfig['trailingSlash'];
format: AstroConfig['build']['format'];
routing?: RoutingStrategies;
strategy?: RoutingStrategies;
defaultLocale: string;
domains: Record<string, string> | undefined;
path?: string;
@ -45,7 +45,7 @@ export function getLocaleRelativeUrl({
path,
prependWith,
normalizeLocale = true,
routing = 'pathname-prefix-other-locales',
strategy = 'pathname-prefix-other-locales',
defaultLocale,
}: GetLocaleRelativeUrl) {
const codeToUse = peekCodePathToUse(_locales, locale);
@ -58,10 +58,10 @@ export function getLocaleRelativeUrl({
const pathsToJoin = [base, prependWith];
const normalizedLocale = normalizeLocale ? normalizeTheLocale(codeToUse) : codeToUse;
if (
routing === 'pathname-prefix-always' ||
routing === 'pathname-prefix-always-no-redirect' ||
routing === 'domains-prefix-always' ||
routing === 'domains-prefix-always-no-redirect'
strategy === 'pathname-prefix-always' ||
strategy === 'pathname-prefix-always-no-redirect' ||
strategy === 'domains-prefix-always' ||
strategy === 'domains-prefix-always-no-redirect'
) {
pathsToJoin.push(normalizedLocale);
} else if (locale !== defaultLocale) {
@ -107,7 +107,7 @@ interface GetLocalesRelativeUrlList extends GetLocaleOptions {
locales: Locales;
trailingSlash: AstroConfig['trailingSlash'];
format: AstroConfig['build']['format'];
routing?: RoutingStrategies;
strategy?: RoutingStrategies;
defaultLocale: string;
domains: Record<string, string> | undefined;
}

View file

@ -106,9 +106,9 @@ export function createI18nMiddleware(
}
const { url, currentLocale } = context;
const { locales, defaultLocale, fallback, routing } = i18n;
const { locales, defaultLocale, fallback, strategy } = i18n;
switch (i18n.routing) {
switch (i18n.strategy) {
case 'domains-prefix-other-locales': {
if (localeHasntDomain(i18n, currentLocale)) {
const result = prefixOtherLocales(url, response);
@ -187,7 +187,7 @@ export function createI18nMiddleware(
let newPathname: string;
// If a locale falls back to the default locale, we want to **remove** the locale because
// the default locale doesn't have a prefix
if (pathFallbackLocale === defaultLocale && routing === 'pathname-prefix-other-locales') {
if (pathFallbackLocale === defaultLocale && strategy === 'pathname-prefix-other-locales') {
newPathname = url.pathname.replace(`/${urlLocale}`, ``);
} else {
newPathname = url.pathname.replace(`/${urlLocale}`, `/${pathFallbackLocale}`);

View file

@ -1,6 +1,5 @@
import type { Locales } from '../@types/astro.js';
import type { AstroConfig, AstroUserConfig, Locales } from '../@types/astro.js';
import { normalizeTheLocale, toCodes } from './index.js';
import type { RoutingStrategies } from '../core/config/schema.js';
type BrowserLocale = {
locale: string;
@ -190,3 +189,39 @@ export function computeCurrentLocale(
}
return undefined;
}
export type RoutingStrategies =
| 'pathname-prefix-always'
| 'pathname-prefix-other-locales'
| 'pathname-prefix-always-no-redirect'
| 'domains-prefix-always'
| 'domains-prefix-other-locales'
| 'domains-prefix-always-no-redirect';
export function toRoutingStrategy(i18n: NonNullable<AstroConfig['i18n']>) {
let { routing, domains } = i18n;
let strategy: RoutingStrategies;
const hasDomains = domains ? Object.keys(domains).length > 0 : false;
if (!hasDomains) {
if (routing?.prefixDefaultLocale === true) {
if (routing.redirectToDefaultLocale) {
strategy = 'pathname-prefix-always';
} else {
strategy = 'pathname-prefix-always-no-redirect';
}
} else {
strategy = 'pathname-prefix-other-locales';
}
} else {
if (routing?.prefixDefaultLocale === true) {
if (routing.redirectToDefaultLocale) {
strategy = 'domains-prefix-always';
} else {
strategy = 'domains-prefix-always-no-redirect';
}
} else {
strategy = 'domains-prefix-other-locales';
}
}
return strategy;
}

View file

@ -1,13 +1,16 @@
import * as I18nInternals from '../i18n/index.js';
import type { I18nInternalConfig } from '../i18n/vite-plugin-i18n.js';
import { toRoutingStrategy } from '../i18n/utils.js';
export { normalizeTheLocale, toCodes, toPaths } from '../i18n/index.js';
const { trailingSlash, format, site, i18n, isBuild } =
// @ts-expect-error
__ASTRO_INTERNAL_I18N_CONFIG__ as I18nInternalConfig;
const { defaultLocale, locales, routing, domains } = i18n!;
const { defaultLocale, locales, domains } = i18n!;
const base = import.meta.env.BASE_URL;
const routing = toRoutingStrategy(i18n!);
export type GetLocaleOptions = I18nInternals.GetLocaleOptions;
/**
@ -40,7 +43,7 @@ export const getRelativeLocaleUrl = (locale: string, path?: string, options?: Ge
format,
defaultLocale,
locales,
routing,
strategy: routing,
domains,
...options,
});
@ -80,7 +83,7 @@ export const getAbsoluteLocaleUrl = (locale: string, path?: string, options?: Ge
site,
defaultLocale,
locales,
routing,
strategy: routing,
domains,
isBuild,
...options,
@ -100,7 +103,7 @@ export const getRelativeLocaleUrlList = (path?: string, options?: GetLocaleOptio
format,
defaultLocale,
locales,
routing,
strategy: routing,
domains,
...options,
});
@ -120,7 +123,7 @@ export const getAbsoluteLocaleUrlList = (path?: string, options?: GetLocaleOptio
format,
defaultLocale,
locales,
routing,
strategy: routing,
domains,
isBuild,
...options,

View file

@ -16,6 +16,7 @@ import { AsyncLocalStorage } from 'node:async_hooks';
import { IncomingMessage } from 'node:http';
import { setRouteError } from './server-state.js';
import { recordServerError } from './error.js';
import { toRoutingStrategy } from '../i18n/utils.js';
export interface AstroPluginOptions {
settings: AstroSettings;
@ -117,7 +118,7 @@ export function createDevelopmentManifest(settings: AstroSettings): SSRManifest
if (settings.config.i18n) {
i18nManifest = {
fallback: settings.config.i18n.fallback,
routing: settings.config.i18n.routing,
strategy: toRoutingStrategy(settings.config.i18n),
defaultLocale: settings.config.i18n.defaultLocale,
locales: settings.config.i18n.locales,
domainLookupTable: {},

View file

@ -10,6 +10,7 @@ import * as assert from 'node:assert/strict';
import { validateConfig } from '../../../dist/core/config/config.js';
import { AstroError } from '#astro/core/errors/index';
import { MissingLocale } from '#astro/core/errors/errors-data';
import { toRoutingStrategy } from '#astro/i18n/utils';
describe('getLocaleRelativeUrl', () => {
it('should correctly return the URL with the base', () => {
@ -231,11 +232,9 @@ describe('getLocaleRelativeUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'en_AU'],
},
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'en_AU'],
},
};
@ -243,9 +242,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'en_US',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en-us/'
);
@ -254,10 +254,11 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'en_US',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
normalizeLocale: false,
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en_US/'
);
@ -266,9 +267,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'en_AU',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en-au/'
);
@ -281,11 +283,11 @@ describe('getLocaleRelativeUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: {
prefixDefaultLocale: true,
},
},
};
@ -297,7 +299,8 @@ describe('getLocaleRelativeUrl', () => {
base: '/blog/',
trailingSlash: 'always',
format: 'directory',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en/'
);
@ -305,9 +308,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/es/'
);
@ -317,9 +321,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en/'
);
@ -327,9 +332,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/es/'
);
@ -342,11 +348,12 @@ describe('getLocaleRelativeUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: 'pathname-prefix-always-no-redirect',
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: {
prefixDefaultLocale: true,
redirectToDefaultLocale: false,
},
},
};
@ -358,7 +365,8 @@ describe('getLocaleRelativeUrl', () => {
base: '/blog/',
trailingSlash: 'always',
format: 'directory',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en/'
);
@ -366,9 +374,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/es/'
);
@ -378,9 +387,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/en/'
);
@ -388,9 +398,10 @@ describe('getLocaleRelativeUrl', () => {
getLocaleRelativeUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'/blog/es/'
);
@ -576,11 +587,11 @@ describe('getLocaleRelativeUrlList', () => {
* @type {import("../../../dist/@types").AstroUserConfig}
*/
const config = {
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: {
prefixDefaultLocale: true,
},
},
};
@ -589,9 +600,10 @@ describe('getLocaleRelativeUrlList', () => {
getLocaleRelativeUrlList({
locale: 'en',
base: '/blog',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'never',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
['/blog/en', '/blog/en-us', '/blog/es']
);
@ -603,11 +615,12 @@ describe('getLocaleRelativeUrlList', () => {
* @type {import("../../../dist/@types").AstroUserConfig}
*/
const config = {
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: 'pathname-prefix-always-no-redirect',
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: {
prefixDefaultLocale: true,
redirectToDefaultLocale: false,
},
},
};
@ -616,9 +629,10 @@ describe('getLocaleRelativeUrlList', () => {
getLocaleRelativeUrlList({
locale: 'en',
base: '/blog',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'never',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
['/blog/en', '/blog/en-us', '/blog/es']
);
@ -795,14 +809,14 @@ describe('getLocaleAbsoluteUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
domains: {
es: 'https://es.example.com',
},
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
domains: {
es: 'https://es.example.com',
},
routing: {
prefixDefaultLocale: true,
},
},
};
@ -815,7 +829,8 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'always',
format: 'directory',
site: 'https://example.com',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -824,10 +839,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -837,10 +853,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -848,10 +865,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -860,11 +878,12 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
site: 'https://example.com',
isBuild: true,
strategy: toRoutingStrategy(config.i18n),
}),
'https://es.example.com/blog/'
);
@ -874,12 +893,13 @@ describe('getLocaleAbsoluteUrl', () => {
locale: 'es',
base: '/blog/',
prependWith: 'some-name',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'file',
site: 'https://example.com',
path: 'first-post',
isBuild: true,
strategy: toRoutingStrategy(config.i18n),
}),
'https://es.example.com/blog/some-name/first-post/'
);
@ -890,11 +910,11 @@ describe('getLocaleAbsoluteUrl', () => {
* @type {import("../../../dist/@types").AstroUserConfig}
*/
const config = {
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es'],
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'es'],
routing: {
prefixDefaultLocale: true,
},
},
};
@ -903,10 +923,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'en',
base: '/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/en/'
);
@ -914,10 +935,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/',
...config.experimental.i18n,
...config.i18n,
trailingSlash: 'always',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/es/'
);
@ -932,7 +954,9 @@ describe('getLocaleAbsoluteUrl', () => {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es'],
routing: 'pathname-prefix-always',
routing: {
prefixDefaultLocale: true,
},
},
};
// directory format
@ -944,6 +968,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'never',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en'
);
@ -955,6 +980,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'always',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -967,6 +993,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'ignore',
format: 'directory',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -980,6 +1007,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'never',
format: 'file',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en'
);
@ -991,6 +1019,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'always',
format: 'file',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -1004,6 +1033,7 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'ignore',
format: 'file',
site: 'https://example.com',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en'
);
@ -1067,11 +1097,11 @@ describe('getLocaleAbsoluteUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: {
prefixDefaultLocale: true,
},
},
};
@ -1084,7 +1114,8 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'always',
site: 'https://example.com',
format: 'directory',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -1092,10 +1123,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -1105,10 +1137,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -1116,10 +1149,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -1132,11 +1166,12 @@ describe('getLocaleAbsoluteUrl', () => {
*/
const config = {
base: '/blog',
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: 'pathname-prefix-always-no-redirect',
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'en_US', 'en_AU'],
routing: {
prefixDefaultLocale: true,
redirectToDefaultLocale: false,
},
},
};
@ -1149,7 +1184,8 @@ describe('getLocaleAbsoluteUrl', () => {
trailingSlash: 'always',
site: 'https://example.com',
format: 'directory',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -1157,10 +1193,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'directory',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -1170,10 +1207,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/en/'
);
@ -1181,10 +1219,11 @@ describe('getLocaleAbsoluteUrl', () => {
getLocaleAbsoluteUrl({
locale: 'es',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
site: 'https://example.com',
trailingSlash: 'always',
format: 'file',
strategy: toRoutingStrategy(config.i18n),
}),
'https://example.com/blog/es/'
);
@ -1491,6 +1530,7 @@ describe('getLocaleAbsoluteUrlList', () => {
path: 'download',
...config,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
}),
[
'https://example.com/en/download/',
@ -1530,6 +1570,7 @@ describe('getLocaleAbsoluteUrlList', () => {
path: 'download',
...config,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
isBuild: true,
}),
[
@ -1671,11 +1712,11 @@ describe('getLocaleAbsoluteUrlList', () => {
* @type {import("../../../dist/@types").AstroUserConfig}
*/
const config = {
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: 'pathname-prefix-always',
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: {
prefixDefaultLocale: true,
},
},
};
@ -1684,7 +1725,8 @@ describe('getLocaleAbsoluteUrlList', () => {
getLocaleAbsoluteUrlList({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
trailingSlash: 'ignore',
format: 'directory',
site: 'https://example.com',
@ -1703,11 +1745,12 @@ describe('getLocaleAbsoluteUrlList', () => {
* @type {import("../../../dist/@types").AstroUserConfig}
*/
const config = {
experimental: {
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: 'pathname-prefix-always-no-redirect',
i18n: {
defaultLocale: 'en',
locales: ['en', 'en_US', 'es'],
routing: {
prefixDefaultLocale: true,
redirectToDefaultLocale: false,
},
},
};
@ -1716,7 +1759,8 @@ describe('getLocaleAbsoluteUrlList', () => {
getLocaleAbsoluteUrlList({
locale: 'en',
base: '/blog/',
...config.experimental.i18n,
...config.i18n,
strategy: toRoutingStrategy(config.i18n),
trailingSlash: 'ignore',
format: 'directory',
site: 'https://example.com',