Se quiser ler esse artigo em Português clique aqui
Recentemente, comecei a aprender Astro para criar um projeto semelhante a um painel.
Eu realmente quero implementar a internacionalização (i18n) neste projeto – a ideia é que todos possam usá-la, independentemente do seu idioma.
O suporte i18n do Astro é muito bom. Funciona de forma semelhante ao Next.js ou qualquer outra estrutura com roteamento baseado na estrutura de arquivos/pastas.
Então, se quisermos ter uma página em inglês e a mesma página em português, podemos organizar nossos arquivos assim:
. └── src/ └── pages/ ├── en/ │ ├── login.astro │ └── dashboard.astro └── pt-br/ ├── login.astro └── dashboard.astro
E cada página tem suas próprias strings i18n – legal!
Mas é aqui que começa o meu problema: não quero clonar todas as minhas páginas; Eu só quero alterar as strings nessas páginas.
Preciso de algo como /[any-language-flag]/all-my-routes.
Você pode perguntar: "Por que não usar algo como react-intl?" Minha resposta é que quero aproveitar totalmente o mecanismo do Astro, especialmente para SSG/SSR, e evitar quaisquer componentes do cliente. Geralmente, esses frameworks usam React Context, que só é renderizado no lado do cliente.
Em primeiro lugar, li a receita do Astro sobre o i18n e verifiquei algumas bibliotecas da comunidade para resolver esse problema.
A primeira biblioteca que testei foi a astro-i18next e parecia exatamente o que eu precisava!
Com base em uma matriz no arquivo de configuração, astro-i18next gera minhas páginas i18n no momento da construção, então só preciso codificar uma vez e não preciso me preocupar com a clonagem de páginas.
O problema é que astro-i18next parece estar arquivado ou não ser mais mantido. Há muitos problemas e o último commit foi há mais de um ano.
Depois de experimentar outras bibliotecas (menção honrosa ao astro-i18n), encontrei o Paraglide, e foi uma virada de jogo para o meu projeto.
Escolhi o Paraglide porque:
Nota: você também pode usar o Paraglide em um projeto JS, e ele também suporta Next.js.
Após a instalação e configuração, usei minhas mensagens assim:
--- import * as m from "../paraglide/messages.js"; ---{m.hello({ name: "Alan" })}
No entanto, isso não resolveu meu problema de roteamento – eu ainda estava clonando minhas páginas para cada idioma que queria adicionar.
Para resolver isso, mudei meu projeto para usar rotas dinâmicas na rota raiz, então todas as minhas rotas agora começam com a flag de idioma.
Minha estrutura de pastas ficou assim:
. └── src/ └── pages/ └── [lang]/ ├── login.astro └── dashboard.astro
Após esta alteração, o Paraglide pode obter automaticamente o idioma do parâmetro de rota:
Agora, posso adicionar um novo idioma apenas definindo-o em astro.config.ts e traduzindo meu arquivo de string.
Mas ainda tenho mais dois problemas para resolver:
Para resolver o primeiro problema de redirecionamento de idioma, usei middlewares Astro.
Em src/middleware/index.ts, adicionei este código:
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(); });
Para manter o usuário na mesma rota quando ele troca de idioma, adicionei este componente:
--- import { languageTag } from '../paraglide/runtime'; const pathName = Astro.url.pathname.replace(`/${languageTag()}/`, ''); ---
Além disso, poderíamos traduzir essas mensagens também, usando o segundo parâmetro na função de mensagens do Paraglide:
Não considero minha solução a melhor, principalmente porque ainda estou aprendendo Astro, então pode haver outras soluções. Se você souber de algum, comente e vou tentar :)
Obrigado por ler este artigo! Se você tiver alguma dúvida, comente, terei prazer em responder.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3