starlight-ion-theme
Version:

49 lines (46 loc) • 1.77 kB
text/typescript
import config from "virtual:starlight/user-config";
import { stripTrailingSlash } from "./path";
/**
* Get the equivalent of the passed URL for the passed locale.
*/
export function localizedUrl(url: URL, locale: string | undefined): URL {
// Create a new URL object to void mutating the global.
url = new URL(url);
if (!config.locales) {
// i18n is not configured on this site, no localization required.
return url;
}
if (locale === "root") locale = "";
/** Base URL with trailing `/` stripped. */
const base = stripTrailingSlash(import.meta.env.BASE_URL);
const hasBase = url.pathname.startsWith(base);
// Temporarily remove base to simplify
if (hasBase) url.pathname = url.pathname.replace(base, "");
const [_leadingSlash, baseSegment] = url.pathname.split("/");
// Strip .html extension to handle file output builds where URL might be e.g. `/en.html`
const htmlExt = ".html";
const isRootHtml = baseSegment?.endsWith(htmlExt);
const baseSlug = isRootHtml
? baseSegment?.slice(0, -1 * htmlExt.length)
: baseSegment;
if (baseSlug && baseSlug in config.locales) {
// We’re in a localized route, substitute the new locale (or strip for root lang).
if (locale) {
url.pathname = url.pathname.replace(baseSlug, locale);
} else if (isRootHtml) {
url.pathname = "/index.html";
} else {
url.pathname = url.pathname.replace("/" + baseSlug, "");
}
} else if (locale) {
// We’re in the root language. Inject the new locale if we have one.
if (baseSegment === "index.html") {
url.pathname = "/" + locale + ".html";
} else {
url.pathname = "/" + locale + url.pathname;
}
}
// Restore base
if (hasBase) url.pathname = base + url.pathname;
return url;
}