16. 国际化配置指南

1538 字
8 分钟
16. 国际化配置指南

国际化配置指南#

基本概念#

国际化(Internationalization,简称 i18n)是指让网站支持多种语言的能力。通过国际化配置,你的博客可以:

  • 支持多语言内容
  • 自动切换语言
  • 提供更好的用户体验
  • 扩大全球受众

配置文件位置#

1. 语言配置#

src/config/siteConfig.ts 中的 lang 字段:

export const siteConfig: SiteConfig = {
// 网站语言
lang: "zh_CN",
};

2. 语言文件#

语言文件通常位于:

  • src/locales/ 目录
  • 每个语言一个文件,如 zh-CN.ts、en.ts 等

语言文件结构#

1. 基本结构#

src/locales/zh-CN.ts
export const zhCN = {
common: {
home: "首页",
about: "关于",
archive: "归档",
search: "搜索",
category: "分类",
tag: "标签",
comments: "评论",
share: "分享",
more: "更多",
backToTop: "回到顶部",
},
nav: {
home: "首页",
about: "关于",
archive: "归档",
categories: "分类",
tags: "标签",
friends: "友链",
sponsor: "赞助",
guestbook: "留言板",
},
post: {
published: "发布于",
updated: "更新于",
author: "作者",
category: "分类",
tags: "标签",
readingTime: "阅读时间",
wordCount: "字数",
comments: "评论",
share: "分享",
relatedPosts: "相关文章",
prevPost: "上一篇",
nextPost: "下一篇",
},
};

2. 英文语言文件#

src/locales/en.ts
export const en = {
common: {
home: "Home",
about: "About",
archive: "Archive",
search: "Search",
category: "Category",
tag: "Tag",
comments: "Comments",
share: "Share",
more: "More",
backToTop: "Back to top",
},
nav: {
home: "Home",
about: "About",
archive: "Archive",
categories: "Categories",
tags: "Tags",
friends: "Friends",
sponsor: "Sponsor",
guestbook: "Guestbook",
},
post: {
published: "Published on",
updated: "Updated on",
author: "Author",
category: "Category",
tags: "Tags",
readingTime: "Reading time",
wordCount: "Word count",
comments: "Comments",
share: "Share",
relatedPosts: "Related posts",
prevPost: "Previous post",
nextPost: "Next post",
},
};

启用多语言支持#

1. 配置语言选项#

在 src/config/i18nConfig.ts 中:

export const i18nConfig = {
// 支持的语言列表
languages: [
{
code: "zh-CN",
name: "中文",
default: true,
},
{
code: "en",
name: "English",
},
],
// 语言切换器配置
switcher: {
show: true,
position: "navbar", // navbar, sidebar, footer
},
};

2. 导入语言文件#

在需要使用翻译的组件中:

import { zhCN, en } from '@/locales';
// 根据当前语言选择翻译
const t = currentLang === 'zh-CN' ? zhCN : en;

翻译内容#

1. 静态内容翻译#

// 在组件中使用
<h1>{t.nav.home}</h1>
<p>{t.post.published}</p>

2. 动态内容翻译#

对于文章内容,通常有两种方式:

方法 A:多语言文件

  • 为每种语言创建单独的文章文件
  • 如 post-zh.md、post-en.md

方法 B:前端翻译

  • 使用翻译函数动态翻译内容
  • 适合简短的动态内容

3. 路由国际化#

为不同语言创建不同的路由:

  • 中文:/posts/my-post/
  • 英文:/en/posts/my-post/

语言切换#

1. 语言切换组件#

src/components/i18n/LanguageSwitcher.astro
---
import { i18nConfig } from '@/config/i18nConfig';
const { languages } = i18nConfig;
---
<div class="language-switcher">
{languages.map(lang => (
<button
key={lang.code}
class={`lang-button ${lang.default ? 'active' : ''}`}
>
{lang.name}
</button>
))}
</div>

2. 语言切换逻辑#

// 切换语言
function switchLanguage(langCode) {
// 保存语言偏好到 localStorage
localStorage.setItem('language', langCode);
// 重新加载页面
window.location.reload();
}
// 获取当前语言
function getCurrentLanguage() {
return localStorage.getItem('language') || 'zh-CN';
}

日期和时间国际化#

1. 日期格式化#

// 格式化日期
function formatDate(date, lang) {
const options = {
year: 'numeric',
month: 'long',
day: 'numeric'
};
return new Intl.DateTimeFormat(lang, options).format(date);
}

2. 时间格式化#

// 格式化时间
function formatTime(date, lang) {
const options = {
hour: '2-digit',
minute: '2-digit'
};
return new Intl.DateTimeFormat(lang, options).format(date);
}

SEO 国际化#

1. 多语言 SEO 最佳实践#

  • hreflang 标签:在头部添加语言 alternate 链接
  • ** canonical URLs**:为每个语言版本设置规范 URL
  • 语言特定内容:为每种语言创建独特的内容
  • 本地化关键词:使用语言特定的关键词

2. hreflang 标签#

<link rel="alternate" hreflang="zh-CN" href="https://your-blog.com/posts/my-post/" />
<link rel="alternate" hreflang="en" href="https://your-blog.com/en/posts/my-post/" />
<link rel="alternate" hreflang="x-default" href="https://your-blog.com/posts/my-post/" />

常见问题#

Q: 语言切换不生效?#

  1. 检查语言文件是否正确导入
  2. 确认 localStorage 是否正确设置
  3. 检查语言切换逻辑是否正确
  4. 清除浏览器缓存

Q: 翻译内容不显示?#

  1. 检查语言文件中的键是否正确
  2. 确认当前语言是否正确
  3. 检查翻译函数是否正确调用
  4. 清除浏览器缓存

Q: 日期格式不正确?#

  1. 检查 Intl.DateTimeFormat 配置
  2. 确认语言代码是否正确
  3. 测试不同浏览器的兼容性

Q: 如何添加新语言?#

  1. 创建新的语言文件(如 ja.ts)
  2. 在 i18nConfig.ts 中添加语言配置
  3. 翻译所有需要的内容
  4. 测试新语言是否正常显示

Q: 如何处理 RTL 语言?#

  1. 为 RTL 语言添加特殊样式
  2. 使用 CSS direction: rtl
  3. 调整布局和排版
  4. 测试 RTL 显示效果

最佳实践#

1. 内容管理#

  • 保持一致性:确保所有语言版本的内容结构一致
  • 专业翻译:使用专业的翻译服务,避免机器翻译
  • 定期更新:确保所有语言版本同步更新
  • 文化适配:考虑不同文化的差异

2. 技术实现#

  • 使用标准:遵循 i18n 最佳实践和标准
  • 性能优化:按需加载语言文件
  • 缓存策略:缓存语言偏好设置
  • 错误处理:处理语言文件加载失败的情况

3. 用户体验#

  • 自动检测:根据浏览器设置自动选择语言
  • 明确切换:提供清晰的语言切换选项
  • 保存偏好:记住用户的语言选择
  • 回退机制:当翻译不存在时使用默认语言

4. SEO 优化#

  • 多语言站点地图:为每种语言创建单独的站点地图
  • 语言特定 URL:使用语言代码作为 URL 前缀
  • 本地化内容:为每种语言创建独特的元数据
  • 结构化数据:使用语言特定的结构化数据

高级配置#

1. 自动翻译工具#

可以使用以下工具辅助翻译:

  • Google Translate API
  • DeepL API
  • i18next
  • react-i18next

2. 翻译管理系统#

对于大型博客,可以使用专业的翻译管理系统:

  • Lokalise
  • Crowdin
  • Transifex
  • POEditor

3. 动态内容翻译#

对于用户生成的内容,可以使用:

  • 实时翻译:使用翻译 API 实时翻译
  • 人工审核:结合机器翻译和人工审核
  • 社区翻译:允许社区贡献翻译

4. 语言检测#

// 检测浏览器语言
function detectBrowserLanguage() {
return navigator.language || navigator.userLanguage;
}
// 检测用户语言偏好
function detectUserLanguage() {
return localStorage.getItem('language') || detectBrowserLanguage() || 'zh-CN';
}

通过合理配置国际化,可以使你的博客面向全球用户,提供更好的多语言体验!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
16. 国际化配置指南
https://blogboy.eu.cc/posts/16/
作者
Coldairboy
发布于
2026-04-08
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Coldairboy
记录学习笔记、折腾过程和日常灵感。
公告
Hi,欢迎来到 Coldairboy学习笔记。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
31
分类
3
标签
5
总字数
36,702
运行时长
0 天
最后活动
0 天前

目录