test02/node_modules/@vuepress/theme-default/lib/client/composables/useNavbarSelectLanguage.js
罗佳鸿 6aa1ebe342
Some checks are pending
部署文档 / deploy-gh-pages (push) Waiting to run
first commit
2024-08-13 10:11:19 +08:00

59 lines
2.6 KiB
JavaScript

import { useThemeData, useThemeLocaleData } from '@theme/useThemeData';
import { useRoutePaths } from '@vuepress/helper/client';
import { computed } from 'vue';
import { useRoute, useRouteLocale, useSiteData, useSiteLocaleData, } from 'vuepress/client';
/**
* Get navbar config of select language dropdown
*/
export const useNavbarSelectLanguage = () => {
const route = useRoute();
const routePaths = useRoutePaths();
const routeLocale = useRouteLocale();
const site = useSiteData();
const siteLocale = useSiteLocaleData();
const theme = useThemeData();
const themeLocale = useThemeLocaleData();
return computed(() => {
const localePaths = Object.keys(site.value.locales);
// do not display language selection dropdown if there is only one language
if (localePaths.length < 2) {
return [];
}
const currentPath = route.path;
const currentFullPath = route.fullPath;
const languageDropdown = {
text: `${themeLocale.value.selectLanguageText}`,
ariaLabel: `${themeLocale.value.selectLanguageAriaLabel ??
themeLocale.value.selectLanguageText}`,
children: localePaths.map((targetLocalePath) => {
// target locale config of this language link
const targetSiteLocale = site.value.locales?.[targetLocalePath] ?? {};
const targetThemeLocale = theme.value.locales?.[targetLocalePath] ?? {};
const targetLang = `${targetSiteLocale.lang}`;
const text = targetThemeLocale.selectLanguageName ?? targetLang;
// if the target language is current language
// stay at current link
if (targetLang === siteLocale.value.lang) {
return {
text,
activeMatch: '.',
link: route.fullPath,
};
}
// if the target language is not current language
// try to link to the corresponding page of current page
// or fallback to homepage
const targetLocalePage = currentPath.replace(routeLocale.value, targetLocalePath);
return {
text,
// try to keep current hash and params across languages
link: routePaths.value.some((item) => item === targetLocalePage)
? currentFullPath.replace(currentPath, targetLocalePage)
: (targetThemeLocale.home ?? targetLocalePath),
};
}),
};
return [languageDropdown];
});
};