Skip to content

Commit a7c04bc

Browse files
authored
fix: map include, exclude to i18n pages (#322)
1 parent ae455da commit a7c04bc

File tree

1 file changed

+33
-3
lines changed

1 file changed

+33
-3
lines changed

Diff for: src/module.ts

+33-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
hasNuxtModuleCompatibility,
1212
useLogger,
1313
} from '@nuxt/kit'
14-
import { withBase, withoutLeadingSlash } from 'ufo'
14+
import { withBase, withLeadingSlash, withoutLeadingSlash, withoutTrailingSlash } from 'ufo'
1515
import { installNuxtSiteConfig } from 'nuxt-site-config-kit'
1616
import type { NuxtI18nOptions } from '@nuxtjs/i18n'
1717
import { defu } from 'defu'
@@ -27,7 +27,7 @@ import type {
2727
SitemapSourceBase,
2828
SitemapSourceInput,
2929
SitemapSourceResolved,
30-
ModuleOptions as _ModuleOptions,
30+
ModuleOptions as _ModuleOptions, FilterInput,
3131
} from './runtime/types'
3232
import { convertNuxtPagesToSitemapEntries, generateExtraRoutesFromNuxtConfig, resolveUrls } from './util/nuxtSitemap'
3333
import { createNitroPromise, createPagesPromise, extendTypes, getNuxtModuleOptions, resolveNitroPreset } from './util/kit'
@@ -151,13 +151,14 @@ export default defineNuxtModule<ModuleOptions>({
151151
let resolvedAutoI18n: false | AutoI18nConfig = typeof config.autoI18n === 'boolean' ? false : config.autoI18n || false
152152
const hasDisabledAutoI18n = typeof config.autoI18n === 'boolean' && !config.autoI18n
153153
let normalisedLocales: NormalisedLocales = []
154+
let usingI18nPages = false
154155
if (hasNuxtModule('@nuxtjs/i18n')) {
155156
const i18nVersion = await getNuxtModuleVersion('@nuxtjs/i18n')
156157
if (!await hasNuxtModuleCompatibility('@nuxtjs/i18n', '>=8'))
157158
logger.warn(`You are using @nuxtjs/i18n v${i18nVersion}. For the best compatibility, please upgrade to @nuxtjs/i18n v8.0.0 or higher.`)
158159
nuxtI18nConfig = (await getNuxtModuleOptions('@nuxtjs/i18n') || {}) as NuxtI18nOptions
159160
normalisedLocales = mergeOnKey((nuxtI18nConfig.locales || []).map((locale: any) => typeof locale === 'string' ? { code: locale } : locale), 'code')
160-
const usingI18nPages = Object.keys(nuxtI18nConfig.pages || {}).length
161+
usingI18nPages = !!Object.keys(nuxtI18nConfig.pages || {}).length
161162
if (usingI18nPages && !hasDisabledAutoI18n) {
162163
const i18nPagesSources: SitemapSourceBase = {
163164
context: {
@@ -448,6 +449,35 @@ declare module 'vue-router' {
448449

449450
// for each sitemap, we need to transform the include and exclude
450451
// if the include or exclude has a URL without a locale prefix, then we insert all locale prefixes
452+
if (resolvedAutoI18n && usingI18nPages && !hasDisabledAutoI18n) {
453+
const pages = nuxtI18nConfig?.pages || {} as Record<string, Record<string, string>>
454+
for (const sitemapName in sitemaps) {
455+
if (['index', 'chunks'].includes(sitemapName))
456+
continue
457+
const sitemap = sitemaps[sitemapName]
458+
function mapToI18nPages(path: FilterInput): FilterInput[] {
459+
if (typeof path !== 'string')
460+
return [path]
461+
const withoutSlashes = withoutTrailingSlash(withoutLeadingSlash(path)).replace('/index', '')
462+
if (withoutSlashes in pages) {
463+
const pageLocales = pages[withoutSlashes]
464+
// @ts-expect-error untyped
465+
return Object.keys(pageLocales).map(localeCode => withLeadingSlash(generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, normalisedLocales })))
466+
}
467+
let match = [path]
468+
// alternatively see if the path matches the default locale within
469+
Object.values(pages).forEach((pageLocales) => {
470+
// @ts-expect-error untyped
471+
if (nuxtI18nConfig.defaultLocale in pageLocales && pageLocales[nuxtI18nConfig.defaultLocale] === path)
472+
// @ts-expect-error untyped
473+
match = Object.keys(pageLocales).map(localeCode => withLeadingSlash(generatePathForI18nPages({ localeCode, pageLocales: pageLocales[localeCode], nuxtI18nConfig, normalisedLocales })))
474+
})
475+
return match
476+
}
477+
sitemap.include = (sitemap.include || []).flatMap(path => mapToI18nPages(path))
478+
sitemap.exclude = (sitemap.exclude || []).flatMap(path => mapToI18nPages(path))
479+
}
480+
}
451481
if (resolvedAutoI18n && resolvedAutoI18n.locales && resolvedAutoI18n.strategy !== 'no_prefix') {
452482
const i18n = resolvedAutoI18n
453483
for (const sitemapName in sitemaps) {

0 commit comments

Comments
 (0)