﻿---
title: 博客多语言适配记录
date: 2026-05-22
tags:
  - hexo
  - i18n
excerpt: 记录 Hexo 多语言适配的设计思路：文件名约定识别语言、filter 偷换 slug 实现路径前缀路由、手写 permalink 处理 Page、generator 按语言隔离聚合页，以及 hreflang、语言切换器、翻译质量标记等前端串联。
i18n:
  en: /en/i18n-in-hexo
  translation: 2
updated: 2026-05-24 22:07:28
---

<script data-swup-reload-script type="module" src="/js/components/tree.js"></script>
<script data-swup-reload-script type="module" src="/js/components/sidenote.js"></script>
<script data-swup-reload-script type="module" src="/js/components/tab.js"></script>

站点运营以来，在归档页中可以发现中文和英文混在一起。为Hexo适配多语言并不容易，因此适配计划被我无限延期。

最近初步实现了多语言支持，最直接的契机是 AnyRouter 的 Opus 模型又能用了。

但更重要的是兴趣使然。前些日子本该专心[[write_uestc_thesis_using_typst|写毕设论文]]，却总忍不住分心去折腾博客，睡前脑子仍在琢磨，乐此不疲。博客打磨后的UI/UX让我很有成就感。

此外，还有锻炼表达能力的目的。回头看以前写的文章，经常会出现一些问题：

- 时不时夹杂外文词句（例如本文标题中的“多语言”，起初用词是i18n，即internationalization）
- 带有明显的“欧化中文”痕迹[^1]。

个人长期接触英文内容，久而久之，表达时会下意识模仿英语的表达方式，而这种生硬的表达无疑有碍理解。 为博客支持多语言，某种意义上也是逼自己克服表达上的懒惰。

另外一个功利的目的：多语言会扩大博客受众群体。虽然去论坛发帖来增加曝光更为直接，但我更喜欢博客中相对私密的交流。

## 源文件组织与路由

### 文件组织：文件名约定

Hexo 官方更推荐“目录约定”，但我最终选择把所有 `.md` 平铺在 `_posts/` 下，通过 `__<lang>` 后缀区分语言；这样原文与译文相邻，查找和编辑更方便。配合 VS Code 的 File Nesting，可以将 `foo__en.md` 折叠到 `foo.md` 下方进一步优化目录观感。

<x-tabs>

<x-tab title="目录约定" active>

<x-tree root="vluv">

- source/\_posts
  - cn/
    - foo.md
    - bar.md
  - en/
    - foo.md
    - bar.md

</x-tree>

</x-tab>
<x-tab title="文件名约定">

<x-tree root="vluv">

- source/\_posts
  - foo.md
  - foo\_\_en.md
  - bar.md
  - bar\_\_en.md

</x-tree>

</x-tab>

<x-tab title="文件名约定 + VSCode File Nesting">

<x-tree root="vluv">

- source/\_posts
  - foo.md
    - foo\_\_en.md
  - bar.md
    - bar\_\_en.md

</x-tree>

方法是在 `settings.json` 中加入：

```json
"explorer.fileNesting.patterns": {
  "*.md": "$(capture)__en.md"
}
```

</x-tab>

</x-tabs>

### 路由设计：路径前缀

采用 `/en/foo/` 路径前缀方案，对 SEO 和缓存更友好。映射关系：

| 角色          | 输入文件名     | 输出 URL     |
| ------------- | -------------- | ------------ |
| 默认语言 post | `foo.md`       | `/foo/`      |
| 翻译版 post   | `foo__en.md`   | `/en/foo/`   |
| 默认语言 page | `about.md`     | `/about/`    |
| 翻译版 page   | `about__en.md` | `/en/about/` |

对于 **Post**，利用 `permalink: :i18n_path:name` 模板，注册一个低优先级的 `post_permalink` filter 注入 `i18n_path`（默认语言 `""`，英文 `"en/"`，可从文件名推断得出）并改写 slug（去掉文件名中的 `__en` 后缀）

**Page** 数量很少，直接在 front-matter 中声明 permalink 即可，例如 `permalink: /en/links/`。

## Archive、Tag 与搜索隔离

- **Tag / Archive**：为每种语言单独运行一次 generator，只传入对应语言的 posts，生成两套完全独立的标签和归档页。
- **搜索**：构建时分别输出 `/content.json` 与 `/en/content.json`，各语言页面加载自己的索引，结果天然不会串语言。

此外还有`sitemap.xml`和`atom.xml`等资源，它们未做语言隔离。

## SEO

为方便搜索引擎正确识别原文与译文的关系，需要在 front-matter 中声明 `i18n` 映射。形如：

<x-tabs>

<x-tab title="中文原文" active>

```md langya_terrace.md
---
title: 琅邪台游记
date: 2026-03-13
excerpt: 孤立特显，出于众山上，下周二十余里，傍滨巨海
tags:
  - Essay
  - 青岛
i18n:
  en: /en/langya_terrace
updated: 2026-05-23 00:30:39
---

原文内容...
```

</x-tab>
<x-tab title="英语译文">

```md langya_terrace__en.md
---
title: Langya Terrace Travel Notes
date: 2026-03-13
excerpt: Standing alone and prominent above all other hills, with a circumference of over twenty li at its base, overlooking the great sea
tags:
  - Essay
  - 青岛
lang: en
i18n:
  cn: /langya_terrace
  translation: 2
updated: 2026-05-23 00:30:59
---

译文内容...
```

</x-tab>

</x-tabs>

主题会根据 `i18n` 字段自动生成 `{html} <link rel="alternate" hreflang>` 标签，指向对应语言版本的 URL，示例如下：

```html
<link rel="canonical" href="https://vluv.space/langya_terrace/" />
<link
  rel="alternate"
  hreflang="zh-CN"
  href="https://vluv.space/langya_terrace/"
/>
<link
  rel="alternate"
  hreflang="en"
  href="https://vluv.space/en/langya_terrace/"
/>
<link
  rel="alternate"
  hreflang="x-default"
  href="https://vluv.space/langya_terrace/"
/>
```

同时 `{html} <html lang>` 和 `og:locale` 也会随页面语言自动切换。

## 交互设计

- **导航栏语言切换**：Archive/Tag/Links/About等页面直接跳转。文章同理，但考虑部分文章未提供翻译，此时点击切换语言需要toast 提示；
- **翻译方式标记**：文章详情页根据 `i18n.translation` 展示翻译状态：默认原文，`1`表示“使用LLM 翻译且已人工审阅”，`2`表示为“采用 LLM 翻译但未审阅”。

![交互设计](https://assets.vluv.space/2026-05-24-Untitled.key-000042.avif)

[^1]:
    [欧化中文](https://baike.baidu.com/item/%E6%AC%A7%E5%8C%96%E4%B8%AD%E6%96%87/9810789#reference-2)是现代汉语在印欧语言（尤指英语）影响下出现的语法现象，主要表现为偏离中文传统表达习惯的句式结构，常见于直译文本与书面语。其特点包括句子结构繁复、被动式滥用、“的”“地”等结构助词过度使用，以及“通过”“作为”等介词套用，常将简单动词分解为“弱动词+抽象名词”的复合结构（如“作出贡献”替代“贡献很大”）。

    该现象源于新文化运动时期，鲁迅、钱玄同等文人主张通过直译欧式语法改造中文思维方式。鲁迅明确提出“直译欧文句法”以革新汉语 。翻译家思果在《翻译研究》中批评此类译文“虽然勉强可以懂，但绝对不是中文”，指出欧化中文违背了汉语本质特征。

    20世纪80年代，余光中在《怎样改进英式中文?》中进一步剖析中文表达的“繁琐与生硬”趋势，批评冗余介词（如“由于”“关于”）、不当连接词（如“及”）及形容词过度依附“的”字等西化特征，强调维护中文表达常态的必要性。
