"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Astro Build를 사용하여 국제화(i)를 위한 동적 경로 만들기

Astro Build를 사용하여 국제화(i)를 위한 동적 경로 만들기

2024-08-22에 게시됨
검색:269

Criando rotas dinâmicas para internacionalização (i) com Astro Build

이 기사를 영어로 읽고 싶다면 여기로 가세요

저는 최근 대시보드 스타일 프로젝트를 만들기 위해 Astro를 배우기 시작했습니다.

저는 이 프로젝트에서 국제화(i18n)를 구현하고 싶습니다. 목표는 언어에 관계없이 누구나 사용할 수 있다는 것입니다.

문제

Astro의 I18n 지원은 매우 좋습니다. 파일/폴더 구조를 기반으로 라우팅하는 Next.js 또는 기타 프레임워크와 유사하게 작동합니다.

따라서 영어 페이지와 포르투갈어 페이지를 갖고 싶다면 다음과 같이 파일을 구성할 수 있습니다.

.
└── src/
    └── pages/
        ├── en/
        │   ├── login.astro
        │   └── dashboard.astro
        └── pt-br/
            ├── login.astro
            └── dashboard.astro

그리고 각 페이지에는 자체 i18n 문자열이 있습니다. 멋지네요!

하지만 여기서 문제가 시작됩니다. 모든 페이지를 복제하고 싶지 않습니다. 해당 페이지의 문자열을 변경하고 싶습니다.

/[any-언어-플래그]/all-my-routes와 같은 것이 필요합니다.

"react-intl과 같은 것을 사용하면 어떨까요?"라고 물을 수도 있습니다. 내 대답은 특히 SSG/SSR의 경우 Astro 엔진을 최대한 활용하고 클라이언트 측 구성 요소를 피하고 싶다는 것입니다. 일반적으로 이러한 프레임워크는 클라이언트 측에서만 렌더링되는 React Context를 사용합니다.

시도와 실패

먼저 i18n에 대한 Astro의 레시피를 읽고 이 문제를 해결하기 위해 일부 커뮤니티 라이브러리를 확인했습니다.

제가 시도한 첫 번째 라이브러리는 astro-i18next였고, 제가 필요로 했던 것과 정확히 같았습니다!

구성 파일의 배열을 기반으로 astro-i18next는 빌드 시 i18n 페이지를 생성하므로 한 번만 코딩하면 페이지 복제에 대해 걱정할 필요가 없습니다.

문제는 astro-i18next가 보관된 것으로 보이거나 더 이상 유지되지 않는다는 것입니다. 문제가 많고 마지막 커밋이 1년이 넘었습니다.

해결책

다른 라이브러리(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-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 메시지 기능의 두 번째 매개변수를 사용하여 이러한 메시지도 번역할 수 있습니다.

고려사항

저는 제 솔루션이 최고라고 생각하지 않습니다. 특히 아직 Astro를 배우는 중이기 때문에 다른 솔루션이 있을 수도 있습니다. 혹시 알고 계신다면 댓글 달아주시면 시도해보겠습니다 :)

이 글을 읽어주셔서 감사합니다! 궁금하신 점은 댓글 달아주시면 답변해드리겠습니다.

릴리스 선언문 이 기사는 https://dev.to/alancpazetto/criando-rotas-dinamicas-para-internacionalizacao-i18n-com-astro-build-1o75?1에 복제되어 있습니다. 침해가 있는 경우에는 [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3