Internacionalización
Xingluo viene con soporte de interfaz de usuario bilingüe (zh-CN / en), utilizando la estrategia de enrutamiento prefixDefaultLocale: false para que el idioma predeterminado no tenga prefijo de URL.
Estrategia de enrutamiento
La configuración i18n de Astro (ver astro.config.ts):
tsi18n: { locales: ["zh-cn", "en"], defaultLocale: "zh-cn", routing: { prefixDefaultLocale: false }, }
Importante: prefixDefaultLocale: false no genera automáticamente copias de página localizadas — debe mantener manualmente las rutas espejo [locale]/.
Enfoque de Xingluo:
- Páginas raíz = idioma predeterminado (
zh-cn), sin prefijo de URL, ej./posts/welcome/ src/pages/[locale]/refleja todas las páginas;getStaticPathsusagetLocaleParams()para generar solo locales no predeterminadas, ej./en/posts/welcome/- Las páginas espejo también son envoltorios finos, reutilizando el mismo componente de vista para la lógica de renderizado
/ → inicio (zh-cn) /en/ → inicio (en) /posts/welcome/ → artículo (zh-cn) /en/posts/welcome/ → artículo (en)
Resolución de locale
Los componentes de vista usan Astro.currentLocale para la resolución automática:
- Páginas raíz →
zh-cn - Páginas con segmento
[locale]→en(u otras locales no predeterminadas)
No se necesitan verificaciones de ruta en la capa de componentes; useTranslations(locale) obtiene las cadenas correspondientes directamente.
Estructura del módulo i18n
| Archivo | Responsabilidad |
|---|---|
index.ts | import.meta.glob("./lang/*.ts", {eager:true}) carga idiomas; exporta DEFAULT_LOCALE, LOCALES, useTranslations(locale), tplStr |
types.ts | Interfaz UIStrings completa (todas las cadenas a localizar) |
routing.ts | getLocalePrefix, withLocale(path, locale), parseLocaleFromPath(pathname) |
staticPaths.ts | NON_DEFAULT_LOCALES, getLocaleParams() |
format.ts | tplStr(template, vars) — reemplazo de marcador {{key}} |
lang/zh-cn.ts | Chino simplificado (predeterminado) |
lang/en.ts | Inglés |
Estructura de UIStrings
La interfaz UIStrings define todas las cadenas de UI a localizar, organizadas en grupos:
nav: navegación (inicio/artículos/etiquetas/acerca/archivos/búsqueda/rss)post: artículo (fecha, compartir, etiquetas, volver, editar, TOC, copia de código, lightbox de imágenes, etc.)pagination: paginaciónhome: página de inicio (enlaces sociales, destacados, recientes)archives: archivos (conteos, meses)footer: pie de página (copyright)pages: títulos y descripciones de páginasa11y: etiquetas de accesibilidadlanguageSwitcher: selector de idiomanotFound: 404comments: sección de comentarios
Cadenas de plantilla
Las cadenas con marcadores usan {{key}}, reemplazadas mediante tplStr:
tsimport { tplStr } from "@/i18n"; // archives.postCount = "{{count}} artículos" tplStr(t.archives.postCount, { count: 5 }); // "5 artículos"
Declaraciones SEO multilingües
El <head> de Layout.astro genera:
<link rel="alternate" hreflang="..." href="...">para cada idiomax-defaultapunta al idioma predeterminado- La integración del sitemap permite que la configuración i18n genere automáticamente hreflang
- Los artículos en locale no predeterminada tienen canonical apuntando al original en la locale predeterminada (para evitar penalizaciones de contenido duplicado; ver SEO)
Añadir un idioma
Ejemplo: añadir japonés ja:
astro.config.ts: añada"ja"ai18n.localesy la asignación"ja": "ja-JP"al sitemapi18n.localessrc/i18n/lang/: creeja.tsexportando unUIStringscompleto (copieen.tsy traduzca)src/i18n/staticPaths.ts:NON_DEFAULT_LOCALESincluye automáticamenteja(calculado desdeLOCALES)src/pages/[locale]/: las páginas espejo generan automáticamente la versiónja(getLocaleParamslo cubre)- Selector de idioma: añada
"ja": "日本語"alanguageSwitcher.namesenzh-cn.tsyen.ts
Traducción a nivel de contenido
Xingluo admite contenido multilingüe de artículos mediante los campos de frontmatter locale y translationKey.
Uso básico
- Artículo en idioma predeterminado: colóquelo en
src/content/posts/<slug>.md, establezcatranslationKeycomo identificador de grupo:
yaml# src/content/posts/welcome.md --- title: "欢迎来到星罗" locale: zh-cn translationKey: welcome-to-xingluo tags: [公告, Astro] ---
- Traducción: colóquela en un subdirectorio de idioma
src/content/posts/<locale>/<slug>.md, usando el mismotranslationKey:
yaml# src/content/posts/en/welcome.md --- title: "Welcome to Xingluo" locale: en translationKey: welcome-to-xingluo tags: [announcement, Astro] ---
Estructura de directorios
src/content/posts/ ├── welcome.md # Idioma predeterminado (zh-cn) ├── en/ │ └── welcome.md # Traducción al inglés ├── ja/ │ └── welcome.md # Traducción al japonés └── another-post.md # Artículo independiente (sin translationKey)
- Los nombres de los subdirectorios de idioma deben coincidir con los códigos de idioma en
i18n.localesdeastro.config.ts - Los subdirectorios de idioma se filtran del slug de URL (ej.
/posts/welcome/, no/posts/en/welcome/) - Los artículos sin
translationKeyson independientes y no están vinculados entre idiomas
Comportamiento de enrutamiento
| Escenario | Comportamiento |
|---|---|
Acceso de locale predeterminada a un artículo zh-cn | Muestra el original en el idioma predeterminado |
| Locale no predeterminada con una traducción | Muestra la traducción correspondiente |
| Locale no predeterminada sin traducción | Vuelve al original en el idioma predeterminado (contenido idéntico, canonical protege el SEO) |
Deduplicación de listas
Las páginas de listado (inicio, lista de artículos, etiquetas, archivos, RSS) usan getPostsForLocale para seleccionar artículos representativos por idioma: cada grupo de traducción muestra solo una tarjeta en el idioma de destino, evitando entradas duplicadas para el mismo tema.
canonical & SEO
- Tiene una traducción independiente: el canonical apunta a la URL propia de la traducción, indexable separadamente por los motores de búsqueda
- Sin traducción (respaldo): el canonical apunta al original en el idioma predeterminado, evitando penalizaciones de contenido duplicado
- Las declaraciones hreflang cubren todos los idiomas, informando a los motores de búsqueda sobre las relaciones entre las versiones de idioma
See SEO.
Artículos relacionados
Despliegue
2 min de lecturaGuía de despliegue de Xingluo que cubre plataformas de alojamiento estático (Netlify/Vercel/GitHub Pages), autoalojamiento Nginx, Docker y variables de entorno.
Búsqueda
1 min de lecturaGuía de búsqueda de Xingluo que cubre la integración de búsqueda de texto completo Flexsearch, generación de índices, UI, búsqueda multilingüe y rendimiento.