Skip to content

Commit 292deb0

Browse files
committed
fix: improved i18n differentDomains support
Fixes nuxt-modules#172
1 parent f9eea76 commit 292deb0

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

src/module.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -175,20 +175,20 @@ export default defineNuxtModule<ModuleOptions>({
175175
const alternatives = Object.keys(pageLocales)
176176
.map(l => ({
177177
hreflang: normalisedLocales.find(nl => nl.code === l)?.iso || l,
178-
href: generatePathForI18nPages({ localeCode: l, pageLocales: pageLocales[l], nuxtI18nConfig }),
178+
href: generatePathForI18nPages({ localeCode: l, pageLocales: pageLocales[l], nuxtI18nConfig, normalisedLocales }),
179179
}))
180180
if (alternatives.length && nuxtI18nConfig.defaultLocale && pageLocales[nuxtI18nConfig.defaultLocale])
181-
alternatives.push({ hreflang: 'x-default', href: generatePathForI18nPages({ localeCode: nuxtI18nConfig.defaultLocale, pageLocales: pageLocales[nuxtI18nConfig.defaultLocale], nuxtI18nConfig }) })
181+
alternatives.push({ hreflang: 'x-default', href: generatePathForI18nPages({ normalisedLocales, localeCode: nuxtI18nConfig.defaultLocale, pageLocales: pageLocales[nuxtI18nConfig.defaultLocale], nuxtI18nConfig }) })
182182
i18nPagesSources.urls!.push({
183183
_sitemap: locale.iso || locale.code,
184-
loc: generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig }),
184+
loc: generatePathForI18nPages({ normalisedLocales, localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig }),
185185
alternatives,
186186
})
187187
// add extra loc with the default locale code prefix on prefix and default strategy
188188
if (nuxtI18nConfig.strategy === 'prefix_and_default' && localeCode === nuxtI18nConfig.defaultLocale) {
189189
i18nPagesSources.urls!.push({
190190
_sitemap: locale.iso || locale.code,
191-
loc: generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, forcedStrategy: 'prefix' }),
191+
loc: generatePathForI18nPages({ normalisedLocales, localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, forcedStrategy: 'prefix' }),
192192
alternatives,
193193
})
194194
}

src/util/i18n.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import type { NuxtI18nOptions } from '@nuxtjs/i18n'
22
import type { Strategies } from 'vue-i18n-routing'
3-
import { joinURL } from 'ufo'
4-
import type { AutoI18nConfig, FilterInput } from '../runtime/types'
3+
import { joinURL, withBase, withHttps } from 'ufo'
4+
import type { AutoI18nConfig, FilterInput, NormalisedLocales } from '../runtime/types'
55
import { splitForLocales } from '../runtime/utils-pure'
66

77
export interface StrategyProps {
88
localeCode: string
99
pageLocales: string
1010
nuxtI18nConfig: NuxtI18nOptions
1111
forcedStrategy?: Strategies
12+
normalisedLocales: NormalisedLocales
1213
}
1314

1415
export function splitPathForI18nLocales(path: FilterInput, autoI18n: AutoI18nConfig) {
@@ -26,15 +27,18 @@ export function splitPathForI18nLocales(path: FilterInput, autoI18n: AutoI18nCon
2627
]
2728
}
2829

29-
export function generatePathForI18nPages({ localeCode, pageLocales, nuxtI18nConfig, forcedStrategy }: StrategyProps): string {
30+
export function generatePathForI18nPages(ctx: StrategyProps): string {
31+
const { localeCode, pageLocales, nuxtI18nConfig, forcedStrategy, normalisedLocales } = ctx
32+
const locale = normalisedLocales.find(l => l.code === localeCode)
33+
let path = pageLocales
3034
switch (forcedStrategy ?? nuxtI18nConfig.strategy) {
3135
case 'prefix_except_default':
3236
case 'prefix_and_default':
33-
return localeCode === nuxtI18nConfig.defaultLocale ? pageLocales : joinURL(localeCode, pageLocales)
37+
path = localeCode === nuxtI18nConfig.defaultLocale ? pageLocales : joinURL(localeCode, pageLocales)
38+
break
3439
case 'prefix':
35-
return joinURL(localeCode, pageLocales)
36-
case 'no_prefix':
37-
default:
38-
return pageLocales
40+
path = joinURL(localeCode, pageLocales)
41+
break
3942
}
43+
return locale?.domain ? withHttps(withBase(path, locale.domain)) : path
4044
}

src/util/nuxtSitemap.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { useNuxt } from '@nuxt/kit'
55
import { extname } from 'pathe'
66
import { defu } from 'defu'
77
import type { ConsolaInstance } from 'consola'
8-
import type { SitemapDefinition, SitemapUrl, SitemapUrlInput } from '../runtime/types'
8+
import { withBase, withHttps } from 'ufo'
9+
import type { NormalisedLocales, SitemapDefinition, SitemapUrl, SitemapUrlInput } from '../runtime/types'
910
import { createPathFilter } from '../runtime/utils-pure'
1011
import type { CreateFilterOptions } from '../runtime/utils-pure'
1112

@@ -27,7 +28,7 @@ export async function resolveUrls(urls: Required<SitemapDefinition>['urls'], ctx
2728
}
2829

2930
export interface NuxtPagesToSitemapEntriesOptions {
30-
normalisedLocales: { code: string, iso?: string }[]
31+
normalisedLocales: NormalisedLocales
3132
routesNameSeparator?: string
3233
autoLastmod: boolean
3334
defaultLocale: string
@@ -148,20 +149,24 @@ export function convertNuxtPagesToSitemapEntries(pages: NuxtPage[], config: Nuxt
148149
}
149150
return entries.map((entry) => {
150151
const alternatives = entries.map((entry) => {
152+
const locale = config.normalisedLocales.find(l => l.code === entry.locale)
151153
// check if the locale has a iso code
152-
const hreflang = config.normalisedLocales.find(l => l.code === entry.locale)?.iso || entry.locale
154+
const hreflang = locale?.iso || entry.locale
153155
if (!pathFilter(entry.loc))
154156
return false
157+
const href = locale?.domain ? withHttps(withBase(entry.loc, locale?.domain)) : entry.loc
155158
return {
156159
hreflang,
157-
href: entry.loc,
160+
href,
158161
}
159162
}).filter(Boolean)
160163
const xDefault = entries.find(a => a.locale === config.defaultLocale)
161164
if (xDefault && alternatives.length && pathFilter(xDefault.loc)) {
165+
const locale = config.normalisedLocales.find(l => l.code === xDefault.locale)
166+
const href = locale?.domain ? withHttps(withBase(xDefault.loc, locale?.domain)) : xDefault.loc
162167
alternatives.push({
163168
hreflang: 'x-default',
164-
href: xDefault.loc,
169+
href,
165170
})
166171
}
167172
const e = { ...entry }

0 commit comments

Comments
 (0)