import type { AvailableLanguageTag } from "@/paraglide/runtime.js" import type { AbsolutePathname, Project } from "@/types/types.ts" interface TranslatedPathnames { nb: AbsolutePathname en: `/en${AbsolutePathname}` } export type NavLink = | "/" | "/contact" | "/projects" | `/projects/${Project["id"]}` | "/links" | "/uses" const paths: Set = new Set([ "/", "/contact", "/projects", "/links", "/uses", ]) const projectPaths: Set = new Set(["homepage", "sb1budget"]) /** * Defines the localized pathnames for the site. * The key must be used to navigate to the correct path. * The value is the path that will be used for the given locale. * * @see https://inlang.com/m/iljlwzfs/paraglide-astro-i18n */ const pathnames: Record = {} for (const path of paths) { pathnames[path] = { nb: path, en: `/en${path}`, } } export function localizePathname( pathname: NavLink, locale: AvailableLanguageTag, ): string { const pathnameParts = pathname.split("/") const firstSegment: AbsolutePathname = `/${pathnameParts[1]}` if (pathnames[firstSegment]) { const localizedPathname = pathnames[firstSegment][locale] const rest = pathnameParts.slice(2) if (rest.length > 0) { return `${localizedPathname}/${rest.join("/")}` } else { return localizedPathname } } return pathname } export function resolvePathname(pathname: string): AbsolutePathname { if (pathname.startsWith("/en")) { return pathname.slice(3) as AbsolutePathname } return pathname as AbsolutePathname } export function isAbsolutePathname(path: string): path is AbsolutePathname { return path.startsWith("/") } export function isNavLink(path: string): path is NavLink { if (path.startsWith("/en")) { path = path.slice(2) } if (paths.has(path as NavLink)) { return true } const pathSplit = path.split("/").slice(1) return ( pathSplit.length === 2 && pathSplit[0] === "projects" && projectPaths.has(pathSplit[1]) ) }