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-언어-플래그]/all-my-routes와 같은 것이 필요합니다.
"react-intl과 같은 것을 사용하면 어떨까요?"라고 물을 수도 있습니다. 내 대답은 Astro의 엔진, 특히 SSG/SSR을 최대한 활용하고 클라이언트 구성 요소를 피하고 싶다는 것입니다. 일반적으로 이러한 프레임워크는 클라이언트 측에서만 렌더링되는 React Context를 사용합니다.
우선 이 문제를 해결하기 위해 i18n에 대한 Astro 레시피를 읽고 일부 커뮤니티 라이브러리를 확인했습니다.
제가 테스트한 첫 번째 라이브러리는 astro-i18next였는데, 제가 필요로 했던 것과 정확히 같았습니다!
구성 파일의 배열을 기반으로 astro-i18next는 빌드 시 i18n 페이지를 생성하므로 한 번만 코딩하면 되며 페이지 복제에 대해 걱정할 필요가 없습니다.
문제는 astro-i18next가 보관되어 있거나 더 이상 유지 관리되지 않는 것 같습니다. 문제가 많고 마지막 커밋이 1년이 넘었습니다.
다른 라이브러리(astro-i18n에 대한 명예로운 언급)를 시도한 후 Paraglide를 찾았고 이는 내 프로젝트의 판도를 바꾸었습니다.
패러글라이드를 선택한 이유는 다음과 같습니다.
참고: JS 프로젝트에서도 Paraglide를 사용할 수 있으며 Next.js도 지원합니다.
설치 및 구성 후 다음과 같은 메시지를 사용했습니다.
--- import * as m from "../paraglide/messages.js"; ---{m.hello({ name: "Alan" })}
그러나 라우팅 문제는 해결되지 않았습니다. 저는 여전히 추가하고 싶은 각 언어에 대해 페이지를 복제하고 있었습니다.
이 문제를 해결하기 위해 루트 경로에서 동적 경로를 사용하도록 프로젝트를 변경했으므로 이제 모든 경로가 언어 플래그로 시작됩니다.
내 폴더 구조는 다음과 같습니다:
. └── src/ └── pages/ └── [lang]/ ├── login.astro └── dashboard.astro
이 변경 후 Paraglide는 경로 매개변수에서 자동으로 언어를 가져올 수 있습니다.
이제 astro.config.ts에서 설정하고 문자열 파일을 번역하기만 하면 새 언어를 추가할 수 있습니다.
하지만 아직 해결해야 할 두 가지 문제가 더 있습니다.
언어 리디렉션의 첫 번째 문제를 해결하기 위해 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를 배우는 중이기 때문에 다른 솔루션이 있을 수도 있습니다. 혹시 알고 계시다면 댓글 달아주시면 시도해보겠습니다 :)
이 글을 읽어주셔서 감사합니다! 궁금하신 점은 댓글 달아주시면 답변드리겠습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3