国际化
Teek 默认使用中文,如果你希望使用其他语言,你可以参考下面的方案。
全局语言配置 v1.1.0
在 Teek.Layout
组件传入 locale
参数,即可设置默认语言。
// .vitepress/config.mts
import Teek, { en } from "vitepress-theme-teek";
import "vitepress-theme-teek/index.css";
export default {
extends: Teek,
Layout: h(Teek.Layout, { locale: en }),
};
如果希望根据 VitePress 的国际化动态切换语言,可以定义一个组件 TeekLayoutProvider.vue
。
<script setup lang="ts">
import Teek, { zhCn, en } from "vitepress-theme-teek";
import { useData } from "vitepress";
import { computed } from "vue";
const { lang } = useData();
const locale = computed(() => {
if (lang.value === "zh-CN") return zhCn;
return en;
});
</script>
<template>
<Teek.Layout :locale />
</template>
然后在 .vitepress/theme/index.ts
中传入 TeekLayoutProvider
组件。
// .vitepress/theme/index.ts
import Teek, { en } from "vitepress-theme-teek";
import "vitepress-theme-teek/index.css";
import TeekLayoutProvider from "../components/TeekLayoutProvider.vue";
export default {
extends: Teek,
Layout: TeekLayoutProvider,
};
lang
是 VitePress 国际化的一个配置项:
import { defineConfig } from "vitepress";
export default defineConfig({
locales: {
root: { lang: "zh-CN" },
en: { lang: "en" },
},
});
语言列表
Teek 目前支持以下语言:
- 简体中文(zh-cn)
- English(en)
自定义语言
如果你需要使用其他的语言,可以添加一个语言配置文件。
比如需要添加繁体中文(zh-tw)语言,步骤如下:
- 创建
.vitepress/theme/locale/zh-tw.ts
文件(路径位置任意) - 然后参考 Teek 现有的任一 语言文件,将里面的内容拷贝到
zh-tw.ts
文件中,并将所有内容(Value)修改为zh-tw
语言 - 最后通过
locale
属性传入到Teek.Layout
组件中
<script setup lang="ts">
import Teek from "vitepress-theme-teek";
import { useData } from "vitepress";
import zhTw from "../locale/zh-tw";
const { lang } = useData();
</script>
<template>
<Teek.Layout :locale="zhTw" />
</template>
provide 方式
除了通过 locale
属性传入语言配置,Teek 也支持通过 provide
方式传入语言配置:
<script setup lang="ts">
import Teek, { localeContextKey, en } from "vitepress-theme-teek";
import { provide } from "vue";
provide(
localeContextKey,
computed(() => en) // 必须是 computer 或者 ref
);
</script>
<template>
<Teek.Layout />
</template>
国际化下配置文件
VitePress 配置
假设国际化环境下,配置文件目录如下:
.vitepress
├─ locales
│ ├─ zh.ts # 中文配置
│ ├─ shared.ts # 共享配置
│ ├─ en.ts # 英文配置
│ ├─ xx.ts # 其他语言配置
├─ config.mts
.vitepress/config.mts
内容如下:
// .vitepress/config.mts
import { defineConfig } from "vitepress";
import shared from "./locales/shared";
import zh from "./locales/zh";
import en from "./locales/en";
export default defineConfig({
...shared,
locales: {
root: { label: "简体中文", ...zh },
en: { label: "English", ...en },
},
});
VitePress 默认会对 shared.ts
和当前语言的配置文件进行合并,且配置同名时,以当前语言配置为主,如 zh.ts
和 en.ts
会覆盖 shared.ts
中的同名配置。
利用这个机制,你可以在 shared.ts
中定义一些通用的配置,然后 zh.ts
和 en.ts
里配置不同语言的配置,如:
import { defineConfig } from "vitepress";
export default defineConfig({
title: "Hd Security",
cleanUrls: false,
lastUpdated: true,
head: [
["link", { rel: "icon", type: "image/svg+xml", href: "/teek-logo-mini.svg" }],
["link", { rel: "icon", type: "image/png", href: "/teek-logo-mini.png" }],
["meta", { property: "og:type", content: "website" }],
["meta", { property: "og:locale", content: "zh-CN" }],
["meta", { property: "og:title", content: "Teek | VitePress Theme" }],
["meta", { name: "author", content: "Teek" }],
[
"meta",
{
name: "viewport",
content: "width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no",
},
],
["link", { rel: "icon", href: "/favicon.ico", type: "image/png" }],
["link", { rel: "stylesheet", href: "//at.alicdn.com/t/font_2989306_w303erbip9.css" }], // 阿里在线矢量库
],
markdown: {
lineNumbers: true,
},
// https://vitepress.dev/reference/default-theme-config
themeConfig: {
logo: "https://testingcf.jsdelivr.net/gh/Kele-Bingtang/static/user/avatar1.png",
search: {
provider: "local",
},
},
});
import { defineConfig } from "vitepress";
const description = ["Teek 使用文档", "VitePress 主题"].toString();
export default defineConfig({
lang: "zh-CN",
description: description,
head: [
["meta", { name: "description", description }],
["meta", { name: "keywords", description }],
],
markdown: {
container: {
tipLabel: "提示",
warningLabel: "警告",
dangerLabel: "危险",
infoLabel: "信息",
detailsLabel: "详细信息",
},
},
themeConfig: {
darkModeSwitchLabel: "主题",
sidebarMenuLabel: "菜单",
returnToTopLabel: "返回顶部",
lastUpdatedText: "上次更新时间",
outline: {
level: [2, 4],
label: "本页导航",
},
docFooter: {
prev: "上一页",
next: "下一页",
},
nav: [
{ text: "首页", link: "/" },
{ text: "指南", link: "/guide/intro" },
{ text: "配置", link: "/reference/config" },
{ text: "开发", link: "/develop/intro" },
{ text: "归档", link: "/archives" },
],
editLink: {
text: "在 GitHub 上编辑此页",
pattern: "https://github.com/Kele-Bingtang/vitepress-theme-teek/edit/master/docs/:path",
},
},
});
import { defineConfig } from "vitepress";
const description = ["Teek Documentation", "VitePress Theme"].toString();
export default defineConfig({
lang: "en-US",
description: description,
head: [
["meta", { name: "description", description }],
["meta", { name: "keywords", description }],
],
markdown: {
container: {
tipLabel: "Tip",
warningLabel: "Warning",
dangerLabel: "Danger",
infoLabel: "Info",
detailsLabel: "Details",
},
},
themeConfig: {
...teekConfig.themeConfig,
darkModeSwitchLabel: "Theme",
sidebarMenuLabel: "Menu",
returnToTopLabel: "To Top",
lastUpdatedText: "LastUpdated",
outline: {
level: [2, 4],
label: "Page Navigation",
},
docFooter: {
prev: "prev",
next: "next",
},
nav: [
{ text: "index", link: "/en" },
{ text: "guide", link: "/guide/intro" },
{ text: "reference", link: "/reference/config" },
{ text: "develop", link: "/develop/intro" },
{ text: "archives", link: "/en/archives" },
],
editLink: {
text: "Edit this page on GitHub",
pattern: "https://github.com/Kele-Bingtang/vitepress-theme-teek/edit/master/docs/:path",
},
},
});
Teek 配置
在非国际化配置文件里下,您可以直接在 VitePress 的配置里使用 extends
来继承 Teek 的配置,但是在国际化配置文件下,extends
配置会失效。
因此需要将 Teek 配置的 themeConfig
手动添加到 VitePress 的 themeConfig
里。
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
const teekConfig = defineTeekConfig({
// 公共配置 ...
});
export default defineConfig({
extends: teekConfig,
// ...
});
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
const teekConfig = defineTeekConfig({
// zh 配置下配置 ...
});
export default defineConfig({
themeConfig: {
...teekConfig.themeConfig,
// ...
},
});
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
const teekConfig = defineTeekConfig({
// ...
});
export default defineConfig({
themeConfig: {
...teekConfig.themeConfig,
// en 环境下配置 ...
},
});
举个例子,您可以在中文和英文环境下分别取不同的名字:
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
const teekConfig = defineTeekConfig({
blogger: {
name: "天客",
slogan: "朝圣的使徒,正在走向编程的至高殿堂!",
},
});
export default defineConfig({
themeConfig: {
...teekConfig.themeConfig,
// ...
},
});
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
const teekConfig = defineTeekConfig({
blogger: {
name: "Teeker",
slogan: "Code Pilgrims march to the summit of code mastery!",
},
});
export default defineConfig({
themeConfig: {
...teekConfig.themeConfig,
// ...
},
});
给 root 语言添加目录
这里对一个特殊场景进行说明。
VitePress 支持的国际化文档目录如下:
docs/
├─ es/
│ ├─ foo.md
├─ fr/
│ ├─ foo.md
├─ foo.md
根目录下的 foo.md
是 root 语言(默认语言)的文档,当 Markdown 文件多起来时,根目录下文件显得很拥挤,那么可以将这些文档放到一个目录下,假设默认语言是 zh
,则:
docs/
├─ es/
│ ├─ foo.md
├─ fr/
│ ├─ foo.md
├─ zh/
│ ├─ foo.md
但是 VitePress 无法感知到 root 语言(默认语言)的文档已经放到 zh
目录下,它依然只扫描根目录的 Markdown 文件作为默认语言的文档,因此需要使用 VitePress 提供的 rewrites
进行重定向,同时 Teek 也无法感知文档进行了移动,因此需要配置 vitePlugins.sidebarOption.localeRootDir
import { defineConfig } from "vitepress";
import { defineTeekConfig } from "vitepress-theme-teek/config";
// Teek 主题配置
const teekConfig = defineTeekConfig({
vitePlugins: {
sidebarOption: {
localeRootDir: "zh",
},
},
});
// VitePress 配置
export default defineConfig({
rewrites: {
"zh/:rest*": ":rest*",
},
});