Starlight项目国际化(i18n)配置指南
2025-07-07 05:39:11作者:戚魁泉Nursing
前言
在当今全球化的互联网环境中,为网站提供多语言支持已成为基本需求。Starlight作为一款现代化的文档站点构建工具,提供了开箱即用的国际化(i18n)解决方案。本文将详细介绍如何在Starlight项目中配置多语言支持,包括基础配置、内容组织、UI翻译等核心功能。
基础配置
1. 语言环境设置
在Starlight中配置国际化支持,首先需要在项目的配置文件中定义支持的语言:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
export default defineConfig({
integrations: [
starlight({
title: '我的文档',
defaultLocale: 'zh-cn', // 设置中文为默认语言
locales: {
'zh-cn': {
label: '简体中文',
lang: 'zh-CN',
},
en: {
label: 'English',
},
ja: {
label: '日本語',
lang: 'ja',
},
},
}),
],
});
关键配置项说明:
defaultLocale
: 指定默认语言,当其他语言版本内容缺失时会回退到此语言locales
: 定义支持的语言列表,每个语言需要指定:label
: 在语言选择器中显示的文本lang
: 可选,设置HTML的lang属性dir
: 可选,设置文本方向(如RTL语言)
2. 内容目录结构
配置完成后,需要按照以下结构组织内容文件:
src/
content/
docs/
zh-cn/ # 简体中文文档
en/ # 英文文档
ja/ # 日文文档
根语言配置
对于希望将默认语言作为根路径(不加语言前缀)的项目,可以使用root配置:
locales: {
root: {
label: '简体中文',
lang: 'zh-CN', // 必须为root语言指定lang属性
},
en: {
label: 'English',
},
}
此时内容目录结构应调整为:
src/
content/
docs/
index.md # 根语言(中文)首页
en/
index.md # 英文首页
内容回退机制
Starlight提供了智能的内容回退机制:
- 当访问
/zh-cn/about
但该文件不存在时 - 系统会自动回退到默认语言的
/en/about
内容 - 同时显示"此页面尚未翻译"的提示
这一机制允许开发者先完成主要语言的内容,再逐步翻译其他语言版本。
UI国际化
1. 翻译站点标题
可以为不同语言设置不同的站点标题:
title: {
'zh-cn': '我的文档',
en: 'My Docs',
ja: '私のドキュメント',
}
2. 翻译UI文本
Starlight的界面元素(如侧边栏、搜索框等)也支持多语言:
- 首先配置i18n数据集合:
// src/content.config.ts
import { defineCollection } from 'astro:content';
import { docsLoader, i18nLoader } from '@astrojs/starlight/loaders';
import { docsSchema, i18nSchema } from '@astrojs/starlight/schema';
export const collections = {
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
i18n: defineCollection({ loader: i18nLoader(), schema: i18nSchema() }),
};
- 为每种语言创建翻译文件:
src/
content/
i18n/
zh-CN.json
en.json
ja.json
- 在JSON文件中添加翻译:
// zh-CN.json
{
"search.label": "搜索",
"404.text": "页面未找到",
"expressiveCode.copyButtonTooltip": "复制到剪贴板"
}
3. 自定义翻译字段
可以扩展默认的翻译schema添加自定义字段:
schema: i18nSchema({
extend: z.object({
'custom.label': z.string().optional(),
}),
}),
在组件中使用翻译
基本用法
<p>{Astro.locals.t('search.label')}</p>
带变量的翻译
// zh-CN.json
{
"welcome": "欢迎,{{user}}!"
}
<p>{Astro.locals.t('welcome', { user: '张三' })}</p>
获取当前语言信息
<p>当前语言方向: {Astro.locals.t.dir()}</p>
<p>当前语言代码: {Astro.currentLocale}</p>
最佳实践建议
- 内容一致性:保持各语言版本的目录结构和文件名一致
- 渐进式翻译:先完成主要语言内容,再逐步翻译其他语言
- 文化适配:注意不同语言的排版差异,特别是RTL语言
- 测试验证:部署前检查各语言版本的显示效果
- 翻译管理:考虑使用专业翻译管理系统(TMS)管理多语言内容
结语
Starlight的国际化支持让开发者能够轻松构建多语言文档站点。通过合理的配置和内容组织,可以为全球用户提供本地化的浏览体验。本文介绍的功能涵盖了从基础配置到高级定制的各个方面,开发者可以根据项目需求灵活选择适合的方案。