在这个指南中,你将学习如何使用内容集合和动态路由来构建你自己的国际化(i18n)解决方案,并针对不同的语言提供你的内容。
假设示例拥有不同语言的子路径,例如面向英语的 example.com/en/blog
和面向法语的 example.com/fr/blog
。
如果你希望默认语言不像其他语言那样在 URL 中可见,后续会有 关于隐藏默认语言的介绍。
请参阅 参考资料部分 以获取与之相关的外部链接,例如从右到左(RTL)样式和选择语言标签。
-
创建一个你想支持的语言的目录。例如,如果你打算支持英语和法语,那么是创建 en/
和 fr/
目录:
-
设置 src/pages/index.astro
重定向到你的默认语言。
这种方式通过 meta refresh 来实现且不会受限于你的部署方式;不过有些静态服务器也允许你通过自定义配置文件来让你的服务器重定向,这可能需要你进一步参考你所使用的部署平台文档。
如果你正好使用 SSR 适配器,那么你也可以使用 Astro.redirect
来重定向到默认语言。
-
在 src/content
文件夹中为每种你想要包含的内容创建一个文件夹,同时在其中也创建对应语言的子目录。假设你现在打算为博客文章支持英语和法语:
-
创建一个 src/content/config.ts
文件并且导出对应的内容集合。
-
使用 动态路由 来获取并基于 lang
和 slug
参数的内容渲染内容。
在静态渲染模式下,可以使用 getStaticPaths
将每个内容条目映射到一个页面中:
在 SSR 模式 (EN) 下,你可以直接获取到请求的内容:
创建术语字典来翻译你网站上用户界面的元素标签,这样可以让访问者在他们的语言环境下更好地体验你的网站。
-
创建一个 src/i18n/ui.ts
文件来存储你翻译后的标签:
-
创建两个辅助函数:一个用来基于当前 URL 检测页面语言,另一个用来获取不同部分的 UI 标签的翻译版本。
-
在需要的地方导入辅助函数并使用它们来选择当前语言环境下的 UI 标签。例如,导航组件可能会像下面这样:
-
每个页面必须在 <html>
元素中包含一个 lang
属性以匹配页面的语言。在这个例子中,可复用布局 会从当前路由中提取语言:
你也可以使用这个基础布局来自动地确保页面使用正确的 lang
属性。
为你所支持的不同语言创建链接,以便用户能选择他们浏览你网站时所使用的语言。
-
创建一个用以显示每个语言的链接的组件:
-
将 <LanguagePicker />
组件放到你的网站中,以便它能在每个页面上显示。如下例子则在基础布局中将它添加到了网站的页脚部分:
-
除默认语言外,为每种语言创建一个目录。例如,将默认语言的页面直接放在 pages/
中,而将翻译的页面放在 fr/
中:
文件夹src/
文件夹pages/
- about.astro
- index.astro
文件夹fr/
-
添加一行代码到 src/i18n/ui.ts
文件中开启隐藏默认语言功能:
-
在 src/i18n/utils.ts
中添加一个辅助函数以根据当前语言对路径翻译:
-
在需要的地方导入这个辅助函数。例如,一个 nav
组件可能如下所示:
-
这个辅助函数也可以用于为特定语言翻译路径。例如,当用户在不同语言之间切换时:
将你页面中的路由翻译成不同语言。
-
在 src/i18n/ui.ts
中添加路由映射。
-
在 src/i18n/utils.ts
中更新 useTranslatedPath
辅助函数以添加路由翻译逻辑:
-
src/i18n/utils.ts
中创建一个辅助函数来获取对应路由,如果该路由存在于当前 URL 的话:
-
这个辅助函数可以用来获取翻译后的路由。例如,当没有定义翻译后的路由时,用户将被重定向到首页:
Recipes