Skip to content

Commit ce1fa96

Browse files
committed
feat(theme-yun): support banner i18n & fix seo description, close #571
1 parent 12f82fb commit ce1fa96

File tree

7 files changed

+28
-12
lines changed

7 files changed

+28
-12
lines changed

demo/yun/theme.config.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ export default defineThemeConfig({
1010

1111
banner: {
1212
enable: true,
13-
title: '云游君的小站',
13+
// title: '云游君的小站',
14+
title: {
15+
'zh-CN': '云游君的小站',
16+
'en': ['Yun', 'You', 'Jun', 'Site'],
17+
},
1418
siteNameClass: 'bg-gradient-to-r gradient-text from-#1e3c72 to-dark dark:from-#66a6ff dark:to-blue-500',
1519
},
1620

packages/valaxy-theme-yun/components/YunBanner.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const themeConfig = useThemeConfig()
1717
1818
// height of top/bottom line
1919
20-
const { totalCharHeight, chars } = useYunBanner(themeConfig.value.banner)
20+
const { totalCharHeight, chars, bannerTitle } = useYunBanner(themeConfig.value.banner)
2121
2222
const bannerStyles = computed<CSSProperties>(() => {
2323
const styles: CSSProperties = {
@@ -64,13 +64,13 @@ onMounted(async () => {
6464
<template v-if="yun.isNimbo">
6565
<YunBannerCharContainer
6666
v-if="animationStatus === 'banner'"
67-
:title="themeConfig.banner.title"
67+
:title="bannerTitle"
6868
:chars="chars"
6969
/>
7070
</template>
7171
<template v-if="yun.isStrato">
7272
<YunBannerCharContainer
73-
:title="themeConfig.banner.title"
73+
:title="bannerTitle"
7474
:chars="chars"
7575
/>
7676
</template>

packages/valaxy-theme-yun/composables/useYunBanner.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import type { YunTheme } from '../types'
2-
import { random } from 'valaxy'
2+
import { random, useValaxyI18n } from 'valaxy'
33
import { computed } from 'vue'
44

55
export function useYunBanner(options: YunTheme.Banner) {
6+
const { $tO } = useValaxyI18n()
7+
8+
const bannerTitle = computed(() => {
9+
if (Array.isArray(options.title)) {
10+
return options.title
11+
}
12+
return $tO<string | string[]>(options.title)
13+
})
614
const chars = computed(() => {
715
const arr = []
8-
for (let i = 0; i < options.title.length; i++) {
16+
for (let i = 0; i < bannerTitle.value.length; i++) {
917
const rn = random(1.5, 3.5)
1018
arr.push(rn)
1119
}
@@ -15,6 +23,7 @@ export function useYunBanner(options: YunTheme.Banner) {
1523
const totalCharHeight = computed(() => chars.value.reduce((a, b) => a + b, 0))
1624

1725
return {
26+
bannerTitle,
1827
chars,
1928
totalCharHeight,
2029
}

packages/valaxy-theme-yun/types/index.d.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ export namespace YunTheme {
1212
/**
1313
* @en Banner title
1414
* @zh 标题,默认每个字分割,你也可以通过数组的方式来自定义分割,如 ['Hello', 'World']
15+
*
16+
* i18n: { 'en': 'Title', 'zh-CN': '标题' }
17+
* { en: ['Hello', 'World'], 'zh-CN': ['你好', '世界'] }
1518
*/
16-
title: string | string[]
19+
title: string | string[] | Record<string, string | string[]>
1720

1821
/**
1922
* 首页下方的动态云

packages/valaxy/client/composables/app/useValaxyApp.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ export function useValaxyApp() {
2626
// seo
2727
// todo: get first image url from markdown
2828
const siteUrl = computed(() => fm.value.url || siteConfig.value.url)
29-
const description = computed(() => fm.value.excerpt || fm.value.description || siteConfig.value.description)
29+
const description = computed(() => $tO(fm.value.excerpt) || $tO(fm.value.description) || $tO(siteConfig.value.description))
3030

3131
useSeoMeta({
3232
description,
3333
ogDescription: description,
3434
ogLocale: computed(() => locale.value || fm.value.lang || siteConfig.value.lang || 'en'),
3535
ogLocaleAlternate: computed(() => siteConfig.value.languages.filter(l => l !== locale.value)),
36-
ogSiteName: computed(() => siteConfig.value.title),
37-
ogTitle: computed(() => $tO(fm.value.title || siteConfig.value.title)),
36+
ogSiteName: computed(() => $t(siteConfig.value.title)),
37+
ogTitle: computed(() => $tO(fm.value.title) || $t(siteConfig.value.title)),
3838
ogImage: computed(() => fm.value.ogImage || fm.value.cover || siteConfig.value.favicon),
3939
ogType: 'website',
4040
ogUrl: siteUrl,

packages/valaxy/client/composables/locale.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export function useValaxyI18n() {
9292
* "en": "Hello"
9393
* }
9494
*/
95-
const $tO = (data?: string | Record<string, string>) => {
95+
const $tO = <T = string>(data?: string | Record<string, T>) => {
9696
return tObject(data || '', locale.value)
9797
}
9898

packages/valaxy/shared/utils/i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* tObject({ 'en': 'English', 'zh-CN': '中文' }, 'fr') // English
1010
* ```
1111
*/
12-
export function tObject(data: string | Record<string, string>, lang: string): string {
12+
export function tObject<T = string>(data: string | Record<string, T>, lang: string): T | string {
1313
if (typeof data === 'object') {
1414
return data[lang] || Object.values(data)[0] || ''
1515
}

0 commit comments

Comments
 (0)