feat: set language selector on navbar

pull/91/head
小倉優悟 5 years ago
parent c71c69b7b3
commit c7682ea148

@ -1,5 +1,5 @@
import { computed } from 'vue' import { computed } from 'vue'
import { useSiteData, useSiteDataByRoute } from 'vitepress' import { useSiteData, useSiteDataByRoute, useRoute } from 'vitepress'
import NavBarLink from './NavBarLink.vue' import NavBarLink from './NavBarLink.vue'
import NavDropdownLink from './NavDropdownLink.vue' import NavDropdownLink from './NavDropdownLink.vue'
import { DefaultTheme } from '../config' import { DefaultTheme } from '../config'
@ -17,6 +17,7 @@ export default {
setup() { setup() {
const siteDataByRoute = useSiteDataByRoute() const siteDataByRoute = useSiteDataByRoute()
const siteData = useSiteData() const siteData = useSiteData()
const route = useRoute()
const repoInfo = computed(() => { const repoInfo = computed(() => {
const theme = siteData.value.themeConfig as DefaultTheme.Config const theme = siteData.value.themeConfig as DefaultTheme.Config
const repo = theme.docsRepo || theme.repo const repo = theme.docsRepo || theme.repo
@ -40,6 +41,32 @@ export default {
} }
return null return null
}) })
const localeCandidates = computed(() => {
const localeKeys = Object.keys(siteData.value.locales)
const currentLangBase = localeKeys.find((v) => {
if (v === '/') {
return false
}
return route.path.startsWith(v)
})
const currentContentPath = currentLangBase
? route.path.substring(currentLangBase.length - 1)
: route.path
const candidates = localeKeys.map((v) => {
return {
text:
siteData.value.locales[v].label || siteData.value.locales[v].lang,
link: `${v}${currentContentPath}`
}
})
return {
// TODO i18n text
text: 'Languages',
items: candidates
}
})
return { return {
navData: navData:
process.env.NODE_ENV === 'production' process.env.NODE_ENV === 'production'
@ -47,7 +74,8 @@ export default {
siteDataByRoute.value.themeConfig.nav siteDataByRoute.value.themeConfig.nav
: // use computed in dev for hot reload : // use computed in dev for hot reload
computed(() => siteDataByRoute.value.themeConfig.nav), computed(() => siteDataByRoute.value.themeConfig.nav),
repoInfo repoInfo,
localeCandidates
} }
} }
} }

@ -7,6 +7,7 @@
</template> </template>
</template> </template>
<NavBarLink v-if="repoInfo" :item="repoInfo" /> <NavBarLink v-if="repoInfo" :item="repoInfo" />
<NavDropdownLink v-if="localeCandidates" :item="localeCandidates" />
</nav> </nav>
</template> </template>

1
types/shared.d.ts vendored

@ -2,6 +2,7 @@
export interface LocaleConfig { export interface LocaleConfig {
lang: string lang: string
label?: string
title?: string title?: string
description?: string description?: string
head?: HeadConfig[] head?: HeadConfig[]

Loading…
Cancel
Save