Hexo 博客多语言配置:通过 Nginx 实现中英文自动切换
本文将指导您如何配置 Hexo 博客,使其支持中英文双语,并实现用户手动切换及基于浏览器语言设置的自动重定向功能。核心思路是利用 Hexo 的多配置文件特性生成不同语言的静态文件,再通过 Nginx 的重写规则进行智能路由。
核心功能说明
URL 结构区分
博客的中文版和英文版通过不同的 URL 前缀进行区分:
- 中文版首页:
https://yourdomain.com/cn/blog/ - 英文版首页:
https://yourdomain.com/en/blog/
手动语言切换
在任何页面,用户都可以通过点击导航栏中的语言切换链接,在两种语言版本间自由跳转。例如,在中文文章页面点击 "English" 链接,即可跳转到对应的英文版页面。
自动语言重定向
当用户访问不包含语言前缀的 URL(如 https://yourdomain.com/blog/post-title/)时,Nginx 会根据其浏览器设置的首选语言,自动将请求重定向到相应的语言版本。
Hexo 多配置设置
创建英文版配置文件
在 Hexo 项目根目录下,创建一个新的配置文件,例如 _config_en.yml,用于定义英文版站点的参数。
# 网站基础信息
title: "My English Blog Title"
subtitle: "A subtitle for the English version"
description: "This is the English description of the blog."
keywords: "english, blog, tech"
language: en # 关键设置,指定语言为英语
# URL 配置
url: "https://example.com/en/blog" # 英文版博客的完整 URL
root: "/en/blog/" # 英文版博客的根路径
# 目录结构
source_dir: source_en # 英文版源文件目录
public_dir: public_en # 英文版静态文件输出目录
此配置文件的核心是 language: en,它告诉 Hexo 使用英文的语言包。同时,通过设置独立的 source_dir 和 public_dir,确保中英文内容被分开处理,互不干扰。
添加构建脚本
为了方便管理,在 package.json 文件中添加针对英文版的构建、清理和本地预览命令。
{
"scripts": {
"build:en": "hexo generate --config _config.yml,_config_en.yml",
"clean:en": "hexo clean --config _config.yml,_config_en.yml",
"server:en": "hexo server --config _config.yml,_config_en.yml"
}
}
这些脚本会同时使用主配置文件和英文版配置文件进行操作,生成叠加后的配置。系统会自动生成一个 _multiconfig.yml 文件,建议将其添加到 .gitignore 中。
Nginx 服务器配置
在 Nginx 的虚拟主机配置中,添加以下规则以实现智能路由。
# 根据浏览器语言首选项进行重定向
if ($http_accept_language ~* "^en") {
rewrite ^(/blog.*)$ /en$1 permanent; # 永久重定向 (301)
}
rewrite ^(/blog.*)$ /cn$1 permanent; # 默认重定向到中文版
# 配置中文版站点
location /cn/blog {
alias /var/www/hexo_blog/public; # 使用 alias 指向中文版静态文件
error_page 404 = $scheme://$host/cn/blog; # 404 时跳转到中文首页
}
# 配置英文版站点
location /en/blog {
alias /var/www/hexo_blog/public_en; # 使用 alias 指向英文版静态文件
error_page 404 = $scheme://$host/en/blog; # 404 时跳转到英文首页
}
上述配置中,$http_accept_language 是 Nginx 内置变量,用于获取请求头中的 Accept-Language。通过正则表达式匹配以 "en" 开头的语言代码,实现英文用户的自动重定向。默认情况下,所有其他语言请求都会被重定向到中文版。alias 指令用于正确映射静态文件目录,而 error_page 则确保当请求的页面不存在时,用户被引导至相应语言的首页。
前端语言切换功能
在主题的 JavaScript 文件中(例如 themes/your-theme/source/js/main.js),添加以下代码以动态生成语言切换链接。
// 检测当前页面语言并生成切换链接
const currentLang = location.pathname.startsWith('/en') ? 'en' : 'cn';
const switchLink = document.createElement('a');
switchLink.className = 'main-nav-link';
if (currentLang === 'en') {
switchLink.textContent = '中文';
switchLink.href = location.pathname.replace('/en', '/cn');
} else {
switchLink.textContent = 'English';
switchLink.href = location.pathname.replace('/cn', '/en');
}
// 将切换链接添加到导航栏
const navContainer = document.querySelector('#sub-nav');
if (navContainer) {
navContainer.insertBefore(switchLink, navContainer.firstChild);
}
此脚本通过检查当前 URL 的路径前缀来判断当前语言。然后,它会创建一个指向另一语言版本的链接,并将其插入到导航栏的指定位置。如果目标页面不存在,Nginx 的重定向规则会自动将其引导至正确的首页。