From 292deb0b4a0c2965a7f06ea029aa9ee6890e3794 Mon Sep 17 00:00:00 2001 From: harlan Date: Mon, 1 Jul 2024 16:09:40 +1000 Subject: [PATCH] fix: improved i18n `differentDomains` support Fixes #172 --- src/module.ts | 8 ++++---- src/util/i18n.ts | 20 ++++++++++++-------- src/util/nuxtSitemap.ts | 15 ++++++++++----- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/module.ts b/src/module.ts index 057812d2..987af6eb 100644 --- a/src/module.ts +++ b/src/module.ts @@ -175,20 +175,20 @@ export default defineNuxtModule({ const alternatives = Object.keys(pageLocales) .map(l => ({ hreflang: normalisedLocales.find(nl => nl.code === l)?.iso || l, - href: generatePathForI18nPages({ localeCode: l, pageLocales: pageLocales[l], nuxtI18nConfig }), + href: generatePathForI18nPages({ localeCode: l, pageLocales: pageLocales[l], nuxtI18nConfig, normalisedLocales }), })) if (alternatives.length && nuxtI18nConfig.defaultLocale && pageLocales[nuxtI18nConfig.defaultLocale]) - alternatives.push({ hreflang: 'x-default', href: generatePathForI18nPages({ localeCode: nuxtI18nConfig.defaultLocale, pageLocales: pageLocales[nuxtI18nConfig.defaultLocale], nuxtI18nConfig }) }) + alternatives.push({ hreflang: 'x-default', href: generatePathForI18nPages({ normalisedLocales, localeCode: nuxtI18nConfig.defaultLocale, pageLocales: pageLocales[nuxtI18nConfig.defaultLocale], nuxtI18nConfig }) }) i18nPagesSources.urls!.push({ _sitemap: locale.iso || locale.code, - loc: generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig }), + loc: generatePathForI18nPages({ normalisedLocales, localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig }), alternatives, }) // add extra loc with the default locale code prefix on prefix and default strategy if (nuxtI18nConfig.strategy === 'prefix_and_default' && localeCode === nuxtI18nConfig.defaultLocale) { i18nPagesSources.urls!.push({ _sitemap: locale.iso || locale.code, - loc: generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, forcedStrategy: 'prefix' }), + loc: generatePathForI18nPages({ normalisedLocales, localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, forcedStrategy: 'prefix' }), alternatives, }) } diff --git a/src/util/i18n.ts b/src/util/i18n.ts index 05e9a155..464bbbe2 100644 --- a/src/util/i18n.ts +++ b/src/util/i18n.ts @@ -1,7 +1,7 @@ import type { NuxtI18nOptions } from '@nuxtjs/i18n' import type { Strategies } from 'vue-i18n-routing' -import { joinURL } from 'ufo' -import type { AutoI18nConfig, FilterInput } from '../runtime/types' +import { joinURL, withBase, withHttps } from 'ufo' +import type { AutoI18nConfig, FilterInput, NormalisedLocales } from '../runtime/types' import { splitForLocales } from '../runtime/utils-pure' export interface StrategyProps { @@ -9,6 +9,7 @@ export interface StrategyProps { pageLocales: string nuxtI18nConfig: NuxtI18nOptions forcedStrategy?: Strategies + normalisedLocales: NormalisedLocales } export function splitPathForI18nLocales(path: FilterInput, autoI18n: AutoI18nConfig) { @@ -26,15 +27,18 @@ export function splitPathForI18nLocales(path: FilterInput, autoI18n: AutoI18nCon ] } -export function generatePathForI18nPages({ localeCode, pageLocales, nuxtI18nConfig, forcedStrategy }: StrategyProps): string { +export function generatePathForI18nPages(ctx: StrategyProps): string { + const { localeCode, pageLocales, nuxtI18nConfig, forcedStrategy, normalisedLocales } = ctx + const locale = normalisedLocales.find(l => l.code === localeCode) + let path = pageLocales switch (forcedStrategy ?? nuxtI18nConfig.strategy) { case 'prefix_except_default': case 'prefix_and_default': - return localeCode === nuxtI18nConfig.defaultLocale ? pageLocales : joinURL(localeCode, pageLocales) + path = localeCode === nuxtI18nConfig.defaultLocale ? pageLocales : joinURL(localeCode, pageLocales) + break case 'prefix': - return joinURL(localeCode, pageLocales) - case 'no_prefix': - default: - return pageLocales + path = joinURL(localeCode, pageLocales) + break } + return locale?.domain ? withHttps(withBase(path, locale.domain)) : path } diff --git a/src/util/nuxtSitemap.ts b/src/util/nuxtSitemap.ts index cddbb9b5..d491ea2a 100644 --- a/src/util/nuxtSitemap.ts +++ b/src/util/nuxtSitemap.ts @@ -5,7 +5,8 @@ import { useNuxt } from '@nuxt/kit' import { extname } from 'pathe' import { defu } from 'defu' import type { ConsolaInstance } from 'consola' -import type { SitemapDefinition, SitemapUrl, SitemapUrlInput } from '../runtime/types' +import { withBase, withHttps } from 'ufo' +import type { NormalisedLocales, SitemapDefinition, SitemapUrl, SitemapUrlInput } from '../runtime/types' import { createPathFilter } from '../runtime/utils-pure' import type { CreateFilterOptions } from '../runtime/utils-pure' @@ -27,7 +28,7 @@ export async function resolveUrls(urls: Required['urls'], ctx } export interface NuxtPagesToSitemapEntriesOptions { - normalisedLocales: { code: string, iso?: string }[] + normalisedLocales: NormalisedLocales routesNameSeparator?: string autoLastmod: boolean defaultLocale: string @@ -148,20 +149,24 @@ export function convertNuxtPagesToSitemapEntries(pages: NuxtPage[], config: Nuxt } return entries.map((entry) => { const alternatives = entries.map((entry) => { + const locale = config.normalisedLocales.find(l => l.code === entry.locale) // check if the locale has a iso code - const hreflang = config.normalisedLocales.find(l => l.code === entry.locale)?.iso || entry.locale + const hreflang = locale?.iso || entry.locale if (!pathFilter(entry.loc)) return false + const href = locale?.domain ? withHttps(withBase(entry.loc, locale?.domain)) : entry.loc return { hreflang, - href: entry.loc, + href, } }).filter(Boolean) const xDefault = entries.find(a => a.locale === config.defaultLocale) if (xDefault && alternatives.length && pathFilter(xDefault.loc)) { + const locale = config.normalisedLocales.find(l => l.code === xDefault.locale) + const href = locale?.domain ? withHttps(withBase(xDefault.loc, locale?.domain)) : xDefault.loc alternatives.push({ hreflang: 'x-default', - href: xDefault.loc, + href, }) } const e = { ...entry }