本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转

实现细则

中英文地址区分

博客中文首页:

https://chanvinxiao.com/cn/blog/

博客英文首页:

https://chanvinxiao.com/en/blog/

中英文切换

例如以下博客中文页面

https://chanvinxiao.com/cn/blog/archives/2020/04/

点击右上角的 English,则切换到以下地址

https://chanvinxiao.com/en/blog/archives/2020/04/

在这个页面点击右上角的中文,则会切换回来

自动跳转

例如以下博客地址

https://chanvinxiao.com/blog/vuejs-tic-tac-toe/

当浏览器语言设置的首选语言为英文时,会跳转到其对应的英文版本

https://chanvinxiao.com/en/blog/vuejs-tic-tac-toe/

当浏览器语言设置的首选语言为中文时,则跳转到其对应的中文版本

https://chanvinxiao.com/cn/blog/vuejs-tic-tac-toe/

Hexo 配置

增加英文配置

在项目根目录下增加 _config-en.yml

# Site
title: TITLE
subtitle: SUBTITLE
description: DESCRIPTION
keywords: KEYWORDS
language: en # URL
url: https://chanvinxiao.com/en/blog
root: /en/blog/ # Directory
source_dir: source-en
public_dir: public-en
  • #Site 相关的配置,主要是把中文的内容改为英文的,关键是将 language 设为 en,这样模版就会使用英文的语言项
  • URLroot 要设置为独立于中文对应的地址和目录
  • 将英文的 sourcepublic 目录和中文区分开,就可以确保中、英文版分别只出现中、英文博客文章

增加相关脚本

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"
},
  • 增加了英文对应的构建、清除和服务器的脚本,中英文相对独立,互不影响
  • 使用自定义配置, 将相应脚本的配置设为 _config.yml_config-en.yml 的叠加配置
  • 系统会自动生成叠加配置文件 _multiconfig.yml,应将此文件添加至 .gitignore 中

Nginx 配置

在 Nginx 对应的 server 中增加以下配置

  if ( $http_accept_language ~* ^en ) {
rewrite ^(/blog.*) /en$1 redirect;
} rewrite ^(/blog.*) /cn$1 redirect; location /cn/blog {
alias /PATH/TO/BLOG/public;
error_page 404 $scheme://$host/cn/blog;
} location /en/blog {
alias /PATH/TO/BLOG/public-en;
error_page 404 $scheme://$host/en/blog;
}
  • $http_accept_language 为 Nginx的 http 模块为请求首部 Accept-Language 设置的内嵌变量,如果浏览器的默认语言为英文,其值将以 en 开头,例如 en-US,en;q=0.9
  • rewrite ^(/blog.*) /en$1 redirect; 相当于把 /blog 开头的地址前面增加 en,rewrite 的标记设置为 redirect 表示 302 跳转,下面默认的 cn 跳转也是一致
  • 以上设置对以 /blog 开头的地址(即未明确语言的地址)进行了判断跳转,如果浏览器默认语言为英文,则跳转到以 /en/blog 开头的英文站,否则默认跳转到以 /cn/blog 开头的中文站
  • 因为 /cn/blog 对应的是 public 目录下的 index.html,而不是 cn/blog/index.html,所以需要使用 alias,而不是 root
  • error_page 设置了 404 处理,$schemehttphttps,标示为页面跳转,分别跳转到对应博客中、英文首页

页面对应切换

以模版 landscape 为例,在 themes/landscape/source/js/script.js 中的 })(jQuery);前,增加以下内容

  let language = {};
language.now = location.pathname.match(/^\/en/) ? 'en' : 'cn';
if('en' === language.now){
language.label = '中文';
language.href = location.pathname.replace(/^\/en/, '/cn');
}else{
language.label = 'English';
language.href = location.pathname.replace(/^\/cn/, '/en');
}
$('#sub-nav').prepend(`<a class="main-nav-link" href="${language.href}">${language.label}</a>`)
  • 根据页面路径前面是否为 /en,确认是博客中文页面还是英文页面
  • 英文页面增加到对应中文页面的链接菜单,中文则增加英文的链接
  • 直接将地址中的 cn 改为 enen 改为 cn 则为对应页面,如果没有对应页面,根据以上的 Nginx 配置,将跳转到对应首页
  • 利用 jQueryprepend 将链接增加到子菜单中,共用类 main-nav-link 的样式

总结

在实现博客中英文过程中,主要使用了以下技术:

  • Hexo 的 自定义配置和 package.json 的 scripts
  • Nginx 的 http 模块的请求首部内嵌变量
  • Nginx 的指令 rewrite, aliaserror_page
  • location 的 pathname 和 jQuery 的 prepend

Hexo 博客利用 Nginx 实现中英文切换的更多相关文章

  1. Hexo博客部署到腾讯云服务器全过程(Nginx,证书,HTTPS),你要的这里都有

    背景 说来也惭愧,博客已经搭建很久了,一直免费的部署在 Coding 和 Github Pages 上,前者迁移到腾讯云 Serverless,导致原有的配置始终有问题,没时间仔细研究,刚好腾讯服务器 ...

  2. 利用Travis IC实现Hexo博客自动化部署

    1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...

  3. Hexo博客系列(二)-在多台机器上利用Hexo发布博客

    [原文链接]:https://www.tecchen.xyz/blog-hexo-env-02.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力 ...

  4. 利用Serverless应用搭建Hexo博客

    本文将介绍如何使用火爆的Serverless应用,15分钟快速搭建Hexo博客.以腾讯云提供的Serverless应用–云开发为例: 步骤1:安装 CloudBase CLI 以及本地部署 Hexo ...

  5. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  6. 在腾讯云上部署Hexo博客

    推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...

  7. 阿里云VPS搭建Hexo博客

    最近买了一个阿里云服务器,准备写自己的网站,和将自己的作品放在上面:开始的时候,感觉就一个服务器应该很简单,但是从申请域名到备案,再到服务器搭建,没想到一波三折:闲话不多说,只是记录我在搭建时,最简单 ...

  8. 将Hexo博客部署到云主机

    摘要: 在云主机上搭建一个git裸仓库,然后使用nginx作为网页服务器,就可以轻松将Hexo博客通过git部署到云主机上. 这是一个忧伤的故事 我的博客KiwenLau之前部署在Coding Pag ...

  9. Hexo 博客 github.io MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 基于RabbitMQ的Rpc框架

    参考文档:https://www.cnblogs.com/ericli-ericli/p/5917018.html 参考文档:RabbitMQ 实现RPC MQ的使用场景大概包括解耦,提高峰值处理能力 ...

  2. A - Wireless Network POJ - 2236

    题目大意:有n台坏掉的电脑,给出每台电脑的坐标,然后每次询问输入0(字符) x,表示电脑x恢复正常,输入S x y 询问x和y是否可以联网.只要是x和y的距离小于距离d,那么就可以联网,如果有个中介c ...

  3. POJ 跳蚤

    Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M ...

  4. js拼接onclick方法字符串参数解决方法

    onclick = contentmap("'+useridarr[i]+'")

  5. CVE-2019-0193 Apache solr velocity模块漏洞

    Solr简单介绍 Solr是建立在Apache Lucene ™之上的一个流行.快速.开放源代码的企业搜索平台. Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自 ...

  6. MySQL服务端恶意读取客户端文件漏洞 (DDCTF2019和国赛均涉及到这个漏洞)

    mysql协议中流程和go语言实现的恶意mysql服务器:https://blog.csdn.net/ls1120704214/article/details/88174003 poc :https: ...

  7. IO多路复用小故事

    背景故事 小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲. 这天, ...

  8. LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  9. C语言指定初始化器解析及其应用

    指定初始化器的概念 C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同.但是在新标准 C99 中,增加了一个新的特性:指定初始化器.利用该特性可以初始化指定的 ...

  10. Jetson AGX Xavier更换apt-get源

    使用apt-get安装时,会很慢,更换了国内的源后,就可以解决这个问题了. 1. 备份sources.list文件 sudo cp /etc/apt/sources.list /etc/apt/sou ...