如果您想阅读这篇英文文章,请点击这里
我最近开始学习 Astro 来创建一个仪表板风格的项目。
我真的很想在这个项目中实现国际化(i18n)——目标是任何人都可以使用它,无论语言如何。
问题
Astro 中的 i18n 支持非常好。它的工作原理类似于 Next.js 或任何其他基于文件/文件夹结构进行路由的框架。
所以,如果我们想要一个英语页面和葡萄牙语页面,我们可以这样组织我们的文件:
. └── src/ └── pages/ ├── en/ │ ├── login.astro │ └── dashboard.astro └── pt-br/ ├── login.astro └── dashboard.astro
每个页面都有自己的 i18n 字符串——酷!
但这就是我的问题开始的地方:我不想克隆我的所有页面;我只想更改这些页面上的字符串。
我需要类似 /[any-language-flag]/all-my-routes 的东西。
你可能会问,“为什么不使用像react-intl这样的东西呢?”我的答案是,我想充分利用 Astro 引擎,尤其是 SSG/SSR,并避免使用任何客户端组件。一般来说,这些框架使用 React Context,仅在客户端渲染。
尝试与失败
首先,我阅读了 Astro 关于 i18n 的食谱,并查看了一些社区库来解决这个问题。
我尝试的第一个库是 astro-i18next,它看起来正是我所需要的!
基于配置文件中的数组,astro-i18next 在构建时生成我的 i18n 页面,因此我只需要编写一次代码,而不必担心克隆页面。
问题是 astro-i18next 似乎已存档或不再维护。问题很多,上次提交已经一年多了。
解决方案
在尝试其他库(astro-i18n 获得荣誉奖)后,我找到了 Paraglide,它改变了我的项目。
我选择滑翔伞是因为:
- 它是类型安全的,因此我可以将它与 TypeScript 一起使用并利用自动完成功能。
- 它将 i18n 字符串转换为函数,因此如果字符串键发生更改,我的构建将会失败,从而尽早捕获错误。
- 使用 i18n 函数可以更好地进行树摇动,删除未使用的函数。
- 有一个 VS Code 扩展,可以改善开发体验。
注意:您也可以在 JS 项目中使用 Paraglide,并且它还支持 Next.js。
安装和配置后,我使用了这样的消息:
--- import * as m from "../paraglide/messages.js"; --- <h1 id="m-hello-name-Alan">{m.hello({ name: "Alan" })}</h1>
但是,这并没有解决我的路由问题 - 我仍在为我想要添加的每种语言克隆我的页面。
为了解决这个问题,我将项目更改为在根路由中使用动态路由,因此我的所有路由现在都以语言标志开头。
我的文件夹结构如下所示:
. └── src/ └── pages/ └── [lang]/ ├── login.astro └── dashboard.astro
此更改后,Paraglide 可以自动获取路线参数的语言:
- http://localhost:4321/en/login
- http://localhost:4321/pt-br/login
现在我只需在 astro.config.ts 中配置它并翻译我的字符串文件即可添加新语言。
但是我还有两个问题需要解决:
- 当用户第一次访问 http://localhost:4321/ 时,没有语言标志。
- 如果用户更改特定路线上的语言,我需要将其保持在同一路线上(例如 /en/create-account 应重定向到 /pt-br/create-account 或 /pt-br/criar-account ).
语言重定向中间件
为了解决第一个语言重定向问题,我使用了 Astro 中间件。
在 src/middleware/index.ts 中,我添加了以下代码:
import { defineMiddleware } from 'astro:middleware'; import { languageTag, setLanguageTag, type AvailableLanguageTag, } from '../paraglide/runtime'; export const onRequest = defineMiddleware((context, next) => { // Obter o idioma do parâmetro da URL const lang = context.params.lang; // Se mudou if (lang !== languageTag()) { setLanguageTag(lang as AvailableLanguageTag); // Redirecionar para o idioma alterado ou padrão (en) return context.redirect(`/${lang ?? 'en'}`); } return next(); });
具有当前路线的语言选择器
为了让用户在更改语言时保持相同的路线,我添加了此组件:
--- import { languageTag } from '../paraglide/runtime'; const pathName = Astro.url.pathname.replace(`/${languageTag()}/`, ''); ---
此外,我们也可以使用 Paraglide 消息函数中的第二个参数来翻译这些消息:
- {m.goToLanguage(undefined, { languageTag: 'pt-br' })}
- {m.goToLanguage(undefined, { languageTag: 'en' })}
注意事项
我不认为我的解决方案是最好的,特别是因为我还在学习 Astro,所以可能还有其他解决方案。如果您知道,请评论,我会尝试:)
感谢您阅读这篇文章!如果有任何疑问,请评论,我很乐意回答。
以上是使用 Astro Build 创建通往国际化的动态路线 (i)的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

将矩阵电影特效带入你的网页!这是一个基于著名电影《黑客帝国》的酷炫jQuery插件。该插件模拟了电影中经典的绿色字符特效,只需选择一张图片,插件就会将其转换为充满数字字符的矩阵风格画面。快来试试吧,非常有趣! 工作原理 插件将图片加载到画布上,读取像素和颜色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地读取图片的矩形区域,并利用jQuery计算每个区域的平均颜色。然后,使用

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

本文将引导您使用jQuery库创建一个简单的图片轮播。我们将使用bxSlider库,它基于jQuery构建,并提供许多配置选项来设置轮播。 如今,图片轮播已成为网站必备功能——一图胜千言! 决定使用图片轮播后,下一个问题是如何创建它。首先,您需要收集高质量、高分辨率的图片。 接下来,您需要使用HTML和一些JavaScript代码来创建图片轮播。网络上有很多库可以帮助您以不同的方式创建轮播。我们将使用开源的bxSlider库。 bxSlider库支持响应式设计,因此使用此库构建的轮播可以适应任何

核心要点 利用 JavaScript 增强结构化标记可以显着提升网页内容的可访问性和可维护性,同时减小文件大小。 JavaScript 可有效地用于为 HTML 元素动态添加功能,例如使用 cite 属性自动在块引用中插入引用链接。 将 JavaScript 与结构化标记集成,可以创建动态用户界面,例如无需页面刷新的选项卡面板。 确保 JavaScript 增强功能不会妨碍网页的基本功能至关重要;即使禁用 JavaScript,页面也应保持功能正常。 可以使用高级 JavaScript 技术(

数据集对于构建API模型和各种业务流程至关重要。这就是为什么导入和导出CSV是经常需要的功能。在本教程中,您将学习如何在Angular中下载和导入CSV文件


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。