Agrega características i18n
Astro no cuenta con soporte integrado para internacionalización (i18n), pero puedes implementar tu propia solución de i18n. En esta receta, aprenderás cómo utilizar colecciones de contenido y enrutamiento dinámico para servir contenido en diferentes idiomas.
Este ejemplo sirve para cada idioma en su propia subruta, p. ej. example.com/en/blog
para inglés y example.com/fr/blog
para francés.
Si prefieres que el idioma predeterminado no sea visible en la URL, a diferencia de otros idiomas, hay instrucciones para ocultar el idioma predeterminado a continuación.
Receta
Sección titulada RecetaConfigura páginas para cada idioma
Sección titulada Configura páginas para cada idioma-
Crea un directorio para cada idioma que desees soportar. Por ejemplo,
en/
yfr/
si estás soportando inglés y francés:Directoriosrc/
Directoriopages/
Directorioen/
- about.astro
- index.astro
Directoriofr/
- about.astro
- index.astro
- index.astro
-
Configura
src/pages/index.astro
para redirigir al idioma predeterminado.Este enfoque utiliza un método meta refresh y funcionará sin importar cómo se despliegue tu sitio. Algunos hosts estáticos también te permiten configurar redirecciones de servidor con un archivo de configuración personalizado. Consulta la documentación de tu plataforma de despliegue para obtener más detalles.
Si estás utilizando un adaptador SSR, puedes utilizar
Astro.redirect
para redirigir al idioma predeterminado en el servidor.
Utiliza colecciones para el contenido traducido.
Sección titulada Utiliza colecciones para el contenido traducido.-
Crea una carpeta en
src/content/
para cada tipo de contenido que desees incluir y agrega subdirectorios para cada idioma compatible. Por ejemplo, para soportar publicaciones de blog en inglés y francés:Directoriosrc/
Directoriocontent/
Directorioblog/
Directorioen/ Artículos de blog en inglés
- post-1.md
- post-2.md
Directoriofr/ Artículos de blog en francés
- post-1.md
- post-2.md
-
Crea un archivo
src/content/config.ts
y exporta una colección para cada tipo de contenido.📚 Lee más sobre Colecciones de Contenido.
-
Utiliza rutas dinámicas para obtener y mostrar contenido basado en los parámetros
lang
yslug
.En el modo de renderizado estático, utiliza
getStaticPaths
para asignar cada entrada de contenido a una página:En el modo SSR, obtén directamente la entrada solicitada:
📚 Lee más sobre enrutamiento dinámico.
El ejemplo anterior utiliza el método integrado
toLocaleString()
de formateo de fechas para crear una cadena legible por humanos a partir de la fecha del encabezado. Esto asegura que la fecha y la hora se formateen de acuerdo con el idioma del usuario.
Traducir strings de la UI
Sección titulada Traducir strings de la UICrea diccionarios de términos para traducir las etiquetas de los elementos de la UI en tu sitio. Esto permitirá que tus visitantes experimenten tu sitio completamente en su idioma.
-
Crea un archivo
src/i18n/ui.ts
para almacenar tus strings de traducción: -
Crea dos funciones auxiliares: una para detectar el idioma de la página según la URL actual y otra para obtener las cadenas de traducción de diferentes partes de la UI en
src/i18n/utils.ts
:En el paso 1, la cadena
nav.twitter
no se tradujo al francés. Es posible que no desees traducir cada término, como nombres propios o términos comunes de la industria. El helperuseTranslations
devolverá el valor del idioma predeterminado si una clave no está traducida. En este ejemplo, los usuarios franceses también verán “Twitter” en la barra de navegación. -
Importa los helpers donde sea necesario y úsalos para elegir el string de UI que corresponda al idioma actual. Por ejemplo, un componente de navegación podría lucir así:
-
Cada página debe tener un atributo
lang
en el elemento<html>
que coincida con el idioma de la página. En este ejemplo, un diseño reutilizable extrae el idioma de la ruta actual:Puedes utilizar este diseño base para asegurarte de que las páginas utilicen automáticamente el atributo
lang
correcto.
Permite a los usuarios cambiar entre idiomas.
Sección titulada Permite a los usuarios cambiar entre idiomas.Crea enlaces a los diferentes idiomas que admites para que los usuarios puedan elegir el idioma en el que desean leer tu sitio.
-
Crea un componente para mostrar un enlace por cada idioma:
-
Agrega
<LanguagePicker />
a tu sitio para que se muestre en todas las páginas. El ejemplo a continuación lo agrega al pie de página del diseño base:
Ocultar el idioma predeterminado en la URL
Sección titulada Ocultar el idioma predeterminado en la URL-
Crea un directorio para cada idioma, excepto el idioma predeterminado. Por ejemplo, guarda las páginas en tu idioma predeterminado directamente en
pages/
, y las páginas traducidas enfr/
:Directoriosrc/
Directoriopages/
- about.astro
- index.astro
Directoriofr/
- about.astro
- index.astro
-
Añade otra línea al archivo
src/i18n/ui.ts
para activar o desactivar la función: -
Agrega una función auxiliar al archivo
src/i18n/utils.ts
para traducir rutas según el idioma actual: -
Importa la función auxiliar donde sea necesario. Por ejemplo, un componente
nav
podría verse así: -
La función auxiliar también puede utilizarse para traducir rutas para un idioma específico. Por ejemplo, cuando los usuarios cambian entre idiomas:
Traducir Rutas
Sección titulada Traducir RutasTraduce las rutas de tus páginas para cada idioma.
-
Añade mappings de rutas al archivo
src/i18n/ui.ts
: -
Actualiza la función auxiliar
useTranslatedPath
en el archivosrc/i18n/utils.ts
para agregar la lógica de traducción de enrutamiento. -
Crea una función auxiliar para obtener la ruta, si existe, basada en la URL actual en el archivo
src/i18n/utils.ts
: -
La función auxiliar se puede utilizar para obtener una ruta traducida. Por ejemplo, cuando no se define una ruta traducida, el usuario será redirigido a la página de inicio:
Recursos
Sección titulada RecursosBibliotecas comunitarias
Sección titulada Bibliotecas comunitarias- astro-i18next — An Astro integration for i18next including some utility components.
- astro-i18n — A TypeScript-first internationalization library for Astro.
- astro-i18n-aut — An Astro integration for i18n that supports the
defaultLocale
without page generation. The integration is adapter agnostic and UI framework agnostic.