”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 Astro Build 中为 i 创建动态路线语言

在 Astro Build 中为 i 创建动态路线语言

发布于2024-08-30
浏览:626

Creating dynamic route language for i in Astro Build

Se quiser ler esse artigo em Portugês clique aqui

最近,我开始学习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,它只在客户端渲染。

尝试与失败

首先,我阅读了关于 i18n 的 Astro 食谱,并查看了一些社区库来解决这个问题。

我测试的第一个库是 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";
---

{m.hello({ name: "Alan" })}

然而,这并没有解决我的路由问题——我仍在为我想要添加的每种语言克隆我的页面。

为了解决这个问题,我将项目更改为在根路由中使用动态路由,因此我的所有路由现在都以语言标志开头。

我的文件夹结构变成了这样:

.
└── src/
    └── pages/
        └── [lang]/
            ├── login.astro
            └── dashboard.astro

此更改后,Paraglide可以自动从路线参数中获取语言:

  • http://localhost:4321/en/login
  • http://localhost:4321/pt-br/login

现在,我只需在 astro.config.ts 中设置新语言并翻译我的字符串文件即可添加新语言。

但是我还有两个问题需要解决:

  1. 当用户第一次访问 http://localhost:4321/ 时不带语言标志。
  2. 如果用户更改特定路线上的语言,我需要将它们保持在同一路线上(例如,/en/create-account 应重定向到 /pt-br/create-account 或 /pt-br/criar -conta).

语言重定向中间件

为了解决第一个问题语言重定向,我使用了Astro中间件。

在src/middleware/index.ts中,我添加了这段代码:

import { defineMiddleware } from 'astro:middleware';
import {
  languageTag,
  setLanguageTag,
  type AvailableLanguageTag,
} from '../paraglide/runtime';

export const onRequest = defineMiddleware((context, next) => {
  // Get lang from url param
  const lang = context.params.lang;

  // If changed
  if (lang !== languageTag()) {
    setLanguageTag(lang as AvailableLanguageTag);
    // Redirect to lang changed or default (en)
    return context.redirect(`/${lang ?? 'en'}`);
  }

  return next();
});

具有当前路线的语言选择器

为了让用户在切换语言时保持相同的路线,我添加了这个组件:

---
import { languageTag } from '../paraglide/runtime';

const pathName = Astro.url.pathname.replace(`/${languageTag()}/`, '');
---

此外,我们也可以使用 Paraglide 消息函数中的第二个参数来翻译这些消息:






注意事项

我不认为我的解决方案是最好的,特别是因为我仍在学习 Astro,所以可能还有其他解决方案。如果您知道,请发表评论,我会尝试一下:)

感谢您阅读本文!如果您有任何疑问,请评论,我很乐意回复。

版本声明 本文转载于:https://dev.to/alancpazetto/creating-dynamic-route-language-for-i18n-in-astro-build-2iim?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-06-29
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-06-29
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-06-29
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-06-29
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-06-29
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-06-29
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-06-29
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-06-29
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-06-29
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-06-29
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-06-29
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-06-29
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否需要手动调用“ delete”操作员在heap-exprogal exit exit上。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(HEAP内存)的指针。当应用程序退出时,此内存是否会自动发布?通常,是。但是,即使在这...
    编程 发布于2025-06-29
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-06-29
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-06-29

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3