心血来潮想做一下多语言站点,于是上网查了一下如何实现都没有找到觉得简单又合适的。但是在 TSTR 老师关于《Hexo 添加多语言支持「国际化 i18n」》的文章中找到了思路,文章中采用了两个 hexo 站点的形式,将多语言的网站放置在不同的路径下。当要发布的时候,再将多语言的生成的 public 文件夹复制到主语言的 public/xx 对应语言文件夹中。是查到现在比较适合我的一种方法。

我将我的英文站点创建在我的源文件夹下的/en/目录,其实只要把当前文件夹的内容复制到/en/下就可以了。这时候我们的流程还是:

生成主站点 > 生成 en 站点 > 复制 en 站点到主站点 public > 发布。

清楚步骤后,再结合我自身的实际情况,开始了多语言站点的改造。

第一步:修改配置,分别生成各自站点

配置文件中的需要修改的地方并不多。主题方面我是用的是 maupassant 主题,我选择是在 menu 上添加多语言的入口(可以在右上角的菜单项看到),所以只要分别在两处主题文件夹的配置文件 _config.yml 中添加:

1
2
3
4
menu:
- page: 中文 ## 英文文件夹下;默认为 English
directory: https://blog.decay.fun ## 同上
icon: fa-language

最后在 en 站点中,修改 hexo 配置的路径即可。

1
2
3
language: en # 原来为 zh-CN
url: https://blog.decay.fun/en ## 原来为 https://blog.decay.fun
root: /en/ ## 原来为 /

第二步:创建脚本,自动生成文章文件

作为一个博客,最重要的还是文章。前期准备结束后,需要考虑的一点是:如果按照之前的方式使用

1
hexo new article-name

的话,在新增的多语言文件夹下还需要再手动复制或者新建同名的文件。通过脚本自动生成是个更合理的做法。我创建了 npm run create artilce-name 命令,接受文章标题来生成需要的文件。运行需要的逻辑如下(有待修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const { exec } = require("child_process");

let title = process.argv.splice(2)[0];
console.log("Creating Post: ", title);

exec(`hexo new ${title}`, (err, out) => {
if (!err) {
console.log("zh_CN File Created: ", out);
exec(`cd ./en && hexo new ${title}`, (err, out) => {
if (!err) {
console.log("en File Created: ", out);
}
});
}
});

这样就可以在对应的目录下正常生成文章文件了。

第三步:发布部署

文章写完了打算部署了,按照上面的流程我们需要按顺序分别生成主、次语言的 public 目录,再做复制的操作。我也写了个脚本进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const { exec } = require("child_process");
const fs = require("fs");

let totalCount = 0,
finishedCount = 0;

exec("hexo clean && hexo g", (err, out) => {
if (!err) {
console.log("CN_SITE_GENERATED");
exec("cd ./en && npm run g", (err, out) => {
if (!err) {
console.log("EN_SITE_GENERATED");
exec("cd ../", () => {
totalCount = getTotalPathCount("./en/public/");
copyDir("./en/public", "./public/en", err => {
if (!err) {
if (totalCount == finishedCount) {
console.log("DEPLOYING...");
exec("hexo deploy", (err, out) => {
if (!err) {
console.log(out);
} else {
console.log(err);
}
exec("exit");
});
}
}
});
});
}
});
}
});

因为 window 下无法使用 spawn 的 cp 命令,所以只好使用 fs 进行遍历复制。命令执行后会运行部署命令,在这里可以根据需要修改。这样一来,多语言站点的开发和部署就完成了。

本文采用上文所述方式进行部署。之前的文章也会慢慢翻译后更新。

以上。