hexo多语言站点方案探索
2025-08-15

该页面由AI翻译并经过人工校对,你可能想要 查看原文

前言

如果您希望在部署博客后只使用单一语言,可以参考 i18n。但是,如果您希望在部署后使用多语言网站,甚至切换显示语言,而您的主题不支持(当然,有些主题,例如 NexT,已经支持),那么这篇博客就非常适合您。

可能的解决方案

创建多个博客并合并它们的public

这种方式,您需要创建多个博客,并使用构建脚本分别构建每个语言的博客,并将它们合并为一个public。

例如,您希望支持英语和中文。您可以使用 pnpm 来管理工作区,并创建如下目录结构。

1
2
3
4
5
6
7
8
my-blog
├── package.json
├── packages
│ ├── en
│ └── zh-CN
├── pnpm-workspace.yaml
└── scripts
└── build.sh

每种语言的博客都被放入packages中,你可以像以前一样在其中撰写文章,除了一些我稍后会提到的更改。

但是,如果你想构建到public,则需要一个自定义的构建脚本,该脚本用于构建每种语言并将其public复制到你的项目根目录的public。

1
2
3
4
5
6
7
8
# build.sh
cd packages/zh-CN
hexo clean && hexo generate
cp -r public ../../public/zh-CN

cd ../en
hexo clean && hexo generate
cp -r public ../../public/en

真正痛苦的是本地预览,hexo server 根本没用。您要么需要实现类似hexo server的功能,要么使用 build.sh 和 http-server 进行预览,但这比hexo server慢得多。

另一个痛点是必须进行一些修改才能确保一切正常。例如,在 packages/zh-CN 目录中,_config.yml 中的root应该是 /zh-CN,并且资源引用路径可能需要以 /zh-CN 为前缀。packages/en也是类似的操作。

起初,我采用了这个解决方案,但逐渐感到厌倦,幸运的是,我找到了另一种更适合我的方法。

自定义主题

谈到自定义主题,我们可能会感到畏惧。但幸运的是,这个主题 arch 支持多语言网站功能。如果您更喜欢使用自己现在的主题并希望使用此功能,可以参考 arch 的实现或寻求其作者的帮助。

据我所知,这个主题基于 hexo-theme-oranges 构建,并支持所有 oranges 的功能。查看其代码,我发现 arch 移除了所有 hexo-generator-*,并在 plugin 中使用了它自己的实现👍。查看源代码后,我发现文章被划分到不同语言的子目录中,而属于同一语言的导航菜单则合并在一起。以下是我当前的目录结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
source
├── _posts
│ ├── en
│ └── zh-CN
├── en
│ ├── 404
│ ├── about
│ ├── categories
│ └── tags
└── zh-CN
├── 404
├── about
├── categories
└── tags

如果您可能需要一个多语言网站,那么 arch 将是您的理想之选。