diff --git a/packages/@vuepress/client/src/app.ts b/packages/@vuepress/client/src/app.ts index c0ae56bd7e..aaebacf829 100644 --- a/packages/@vuepress/client/src/app.ts +++ b/packages/@vuepress/client/src/app.ts @@ -123,9 +123,7 @@ export const createVueApp = async ({ siteLocaleData.value ) ) - const pageLang = computed(() => - resolvePageLang(pageFrontmatter.value, siteLocaleData.value) - ) + const pageLang = computed(() => resolvePageLang(pageData.value)) // provide global computed app.provide(routeLocaleSymbol, routeLocale) diff --git a/packages/@vuepress/client/src/injections/pageData.ts b/packages/@vuepress/client/src/injections/pageData.ts index 7c0dac73b3..badf920e3d 100644 --- a/packages/@vuepress/client/src/injections/pageData.ts +++ b/packages/@vuepress/client/src/injections/pageData.ts @@ -12,6 +12,7 @@ const pageDataEmpty = readonly({ key: '', path: '', title: '', + lang: '', frontmatter: {}, excerpt: '', headers: [], diff --git a/packages/@vuepress/client/src/injections/pageLang.ts b/packages/@vuepress/client/src/injections/pageLang.ts index daac7d0f64..0bc949de04 100644 --- a/packages/@vuepress/client/src/injections/pageLang.ts +++ b/packages/@vuepress/client/src/injections/pageLang.ts @@ -1,8 +1,6 @@ import { inject } from 'vue' import type { ComputedRef, InjectionKey } from 'vue' -import { isString } from '@vuepress/shared' -import type { PageFrontmatter } from './pageFrontmatter' -import type { SiteLocaleData } from './siteLocaleData' +import type { PageData } from '@vuepress/shared' export type PageLang = string export type PageLangRef = ComputedRef @@ -19,12 +17,11 @@ export const usePageLang = (): PageLangRef => { return pageLang } -export const resolvePageLang = ( - frontmatter: PageFrontmatter, - siteLocale: SiteLocaleData -): PageLang => { - if (isString(frontmatter.lang) && frontmatter.lang) { - return frontmatter.lang - } - return siteLocale.lang || 'en' -} +/** + * Resolve language of current page + * + * It's mainly used for the `lang` attribute of `` tag, + * which should not be empty + */ +export const resolvePageLang = (pageData: PageData): PageLang => + pageData.lang || 'en' diff --git a/packages/@vuepress/core/src/app/prepare/resolvePageData.ts b/packages/@vuepress/core/src/app/prepare/resolvePageData.ts index da5b8b93b0..a6edd5282e 100644 --- a/packages/@vuepress/core/src/app/prepare/resolvePageData.ts +++ b/packages/@vuepress/core/src/app/prepare/resolvePageData.ts @@ -7,6 +7,7 @@ export const resolvePageData = ({ key, path, title, + lang, frontmatter, excerpt, headers, @@ -15,6 +16,7 @@ export const resolvePageData = ({ key, path, title, + lang, frontmatter, excerpt, headers, diff --git a/packages/@vuepress/core/src/page/createPage.ts b/packages/@vuepress/core/src/page/createPage.ts index 4841205205..4181f0cb10 100644 --- a/packages/@vuepress/core/src/page/createPage.ts +++ b/packages/@vuepress/core/src/page/createPage.ts @@ -9,6 +9,7 @@ import { resolvePageFileContent } from './resolvePageFileContent' import { resolvePageFilePath } from './resolvePageFilePath' import { resolvePageFrontmatter } from './resolvePageFrontmatter' import { resolvePageKey } from './resolvePageKey' +import { resolvePageLang } from './resolvePageLang' import { resolvePagePath } from './resolvePagePath' import { resolvePagePermalink } from './resolvePagePermalink' import { resolvePageRoutesInfo } from './resolvePageRoutesInfo' @@ -48,6 +49,9 @@ export const createPage = async ( // infer page path according to file path const { pathInferred, pathLocale } = inferPagePath({ app, filePathRelative }) + // resolve language from frontmatter and site options + const lang = resolvePageLang({ app, frontmatter, pathLocale }) + // resolve page permalink const permalink = resolvePagePermalink({ options, @@ -118,5 +122,6 @@ export const createPage = async ( links, slug, date, + lang, } } diff --git a/packages/@vuepress/core/src/page/index.ts b/packages/@vuepress/core/src/page/index.ts index 3ddfb86a6a..cea348a39c 100644 --- a/packages/@vuepress/core/src/page/index.ts +++ b/packages/@vuepress/core/src/page/index.ts @@ -9,6 +9,7 @@ export * from './resolvePageFileContent' export * from './resolvePageFilePath' export * from './resolvePageFrontmatter' export * from './resolvePageKey' +export * from './resolvePageLang' export * from './resolvePagePath' export * from './resolvePagePermalink' export * from './resolvePageRoutesInfo' diff --git a/packages/@vuepress/core/src/page/inferPagePath.ts b/packages/@vuepress/core/src/page/inferPagePath.ts index 9564d8c9d5..7453d15167 100644 --- a/packages/@vuepress/core/src/page/inferPagePath.ts +++ b/packages/@vuepress/core/src/page/inferPagePath.ts @@ -28,7 +28,7 @@ export const inferPagePath = ({ .replace(/\/(README|index).html$/i, '/') // resolve page locale path - const pathLocale = resolveLocalePath(app.options.locales, pathInferred) + const pathLocale = resolveLocalePath(app.siteData.locales, pathInferred) return { pathInferred, diff --git a/packages/@vuepress/core/src/page/resolvePageLang.ts b/packages/@vuepress/core/src/page/resolvePageLang.ts new file mode 100644 index 0000000000..10d1a53494 --- /dev/null +++ b/packages/@vuepress/core/src/page/resolvePageLang.ts @@ -0,0 +1,20 @@ +import { isString } from '@vuepress/shared' +import type { App, PageFrontmatter } from '../types' + +/** + * Resolve language of page + */ +export const resolvePageLang = ({ + app, + frontmatter, + pathLocale, +}: { + app: App + frontmatter: PageFrontmatter + pathLocale: string +}): string => { + if (isString(frontmatter.lang) && frontmatter.lang) { + return frontmatter.lang + } + return app.siteData.locales[pathLocale]?.lang ?? app.siteData.lang ?? '' +} diff --git a/packages/@vuepress/shared/src/types/page.ts b/packages/@vuepress/shared/src/types/page.ts index e72948f6d7..ee0a72a07d 100644 --- a/packages/@vuepress/shared/src/types/page.ts +++ b/packages/@vuepress/shared/src/types/page.ts @@ -32,6 +32,11 @@ export type PageData< */ title: string + /** + * Language of the page + */ + lang: string + /** * Front matter of the page */