Haz tu pregunta y obtén un resumen del documento referenciando esta página y el proveedor AI de tu elección
Al integrar el servidor MCP Intlayer a tu asistente de IA, puedes recuperar todos los documentos directamente desde ChatGPT, DeepSeek, Cursor, VSCode, etc.
Ver la documentación del servidor MCPEl contenido de esta página ha sido traducido con una IA.
Ver la última versión del contenido original en inglésSi tienes una idea para mejorar esta documentación, no dudes en contribuir enviando una pull request en GitHub.
Enlace de GitHub a la documentaciónCopiar el Markdown del documento a la portapapeles
Primeros pasos con la internacionalización (i18n) en Angular usando Intlayer
Este paquete está en desarrollo. Consulta el issue para más información. Muestra tu interés en Intlayer para Angular dando like al issue
¿Qué es Intlayer?
Intlayer es una biblioteca innovadora y de código abierto para la internacionalización (i18n) diseñada para simplificar el soporte multilingüe en aplicaciones web modernas.
Con Intlayer, puedes:
- Gestionar fácilmente las traducciones usando diccionarios declarativos a nivel de componente.
- Localizar dinámicamente metadatos, rutas y contenido.
- Garantizar soporte para TypeScript con tipos autogenerados, mejorando la autocompletación y la detección de errores.
- Beneficiarte de funciones avanzadas, como la detección y el cambio dinámico de la configuración regional.
Guía paso a paso para configurar Intlayer en una aplicación Angular
Paso 1: Instalar dependencias
Instala los paquetes necesarios usando npm:
Copiar el código al portapapeles
npm install intlayer angular-intlayer @intlayer/webpack
intlayer
El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, declaración de contenido, transpilación y comandos CLI.
angular-intlayer El paquete que integra Intlayer con la aplicación Angular. Proporciona proveedores de contexto y hooks para la internacionalización en Angular.
@intlayer/webpack El paquete que integra Intlayer con Webpack. Es utilizado por el Angular CLI para construir archivos de declaración de contenido y monitorearlos en modo desarrollo.
Paso 2: Configuración de tu proyecto
Crea un archivo de configuración para configurar los idiomas de tu aplicación:
Copiar el código al portapapeles
import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Tus otros locales ], defaultLocale: Locales.ENGLISH, },};export default config;
El paquete que integra Intlayer con Webpack. Es utilizado por el Angular CLI para construir archivos de declaración de contenido y monitorearlos en modo desarrollo.
Paso 2: Configuración de tu proyecto
Crea un archivo de configuración para configurar los idiomas de tu aplicación:
Copiar el código al portapapeles
import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Tus otros locales ], defaultLocale: Locales.ENGLISH, },};export default config;
A través de este archivo de configuración, puedes configurar URLs localizadas, redirección mediante middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido, desactivar los registros de Intlayer en la consola y más. Para una lista completa de los parámetros disponibles, consulta la documentación de configuración.
Paso 3: Integra Intlayer en tu configuración de Angular
Para integrar Intlayer con el CLI de Angular, tienes dos opciones dependiendo de tu builder: esbuild o webpack.
Opción 1: Usar esbuild (Recomendado)
Primero, modifica tu angular.json para usar el builder personalizado de esbuild. Actualiza la configuración de build:
Asegúrate de reemplazar your-app-name con el nombre real de tu proyecto en angular.json.
A continuación, crea un archivo esbuild/intlayer-plugin.ts en la raíz de tu proyecto:
Copiar el código al portapapeles
import { prepareIntlayer, watch } from "@intlayer/chokidar";import { getConfiguration, logger } from "@intlayer/config";import type { Plugin } from "esbuild";const intlayerPlugin: Plugin = { name: "intlayer-esbuild-plugin", setup(build) { const configuration = getConfiguration(); let isWatching = false; build.onStart(async () => { logger("Plugin Intlayer para esbuild iniciado", { level: "info", }); if (build.initialOptions.watch && !isWatching) { logger("Modo watch activado. Iniciando watcher...", { level: "info", }); watch(configuration); isWatching = true; } try { await prepareIntlayer(configuration); } catch (error) { logger(`Error en el plugin Intlayer para esbuild: ${error}`, { level: "error", }); } }); },};export default intlayerPlugin;
El intlayerPlugin para esbuild asegura que Intlayer esté preparado antes de que comience la compilación y observa los cambios en modo desarrollo.
Opción 2: Usando Webpack
Primero, modifica tu archivo angular.json para usar el constructor personalizado de Webpack. Actualiza las configuraciones de build y serve:
Copiar el código al portapapeles
{ "projects": { "your-app-name": { "architect": { "build": { "builder": "@angular-builders/custom-webpack:browser", "options": { "customWebpackConfig": { "path": "./webpack.config.js" } } }, "serve": { "builder": "@angular-builders/custom-webpack:dev-server" } } } }}
Asegúrate de reemplazar your-app-name con el nombre real de tu proyecto en angular.json.
A continuación, crea un archivo webpack.config.js en la raíz de tu proyecto:
Copiar el código al portapapeles
const { IntlayerWebpackPlugin } = require("@intlayer/webpack");module.exports = { plugins: [new IntlayerWebpackPlugin()],};
El IntlayerWebpackPlugin se utiliza para integrar Intlayer con Webpack. Asegura la construcción de los archivos de declaración de contenido y los supervisa en modo desarrollo. Define las variables de entorno de Intlayer dentro de la aplicación. Además, proporciona alias para optimizar el rendimiento.
Paso 4: Declara Tu Contenido
Crea y gestiona tus declaraciones de contenido para almacenar las traducciones:
Copiar el código al portapapeles
import { t, type Dictionary } from "intlayer";const appContent = { key: "app", content: { title: t({ en: "Hello", fr: "Bonjour", es: "Hola", }), congratulations: t({ en: "Congratulations! Your app is running. 🎉", fr: "Félicitations! Votre application est en cours d'exécution. 🎉", es: "¡Felicidades! Tu aplicación está en ejecución. 🎉", }), exploreDocs: t({ en: "Explore the Docs", fr: "Explorer les Docs", es: "Explorar la documentación", }), learnWithTutorials: t({ en: "Learn with Tutorials", fr: "Apprendre avec les Tutoriels", es: "Aprender con tutoriales", }), cliDocs: "Documentación CLI", angularLanguageService: t({ en: "Angular Language Service", fr: "Service de Langage Angular", es: "Servicio de Lenguaje Angular", }), angularDevTools: "Angular DevTools", github: "Github", twitter: "Twitter", youtube: "Youtube", },} satisfies Dictionary;export default appContent;
Tus declaraciones de contenido pueden definirse en cualquier parte de tu aplicación siempre que se incluyan en el directorio contentDir (por defecto, ./src). Y coincidan con la extensión del archivo de declaración de contenido (por defecto, .content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}).
Para más detalles, consulta la documentación de declaración de contenido.
Paso 5: Utiliza Intlayer en tu Código
Para utilizar las funcionalidades de internacionalización de Intlayer en toda tu aplicación Angular, necesitas usar la función useIntlayer dentro de un componente. Esta función, disponible desde angular-intlayer, proporciona acceso a tus traducciones como señales reactivas.
IntlayerProvider está registrado en la raíz de la aplicación, por lo que no necesitas añadirlo a los proveedores de tu módulo.
Accede a tus diccionarios de contenido en la clase de tu componente:
Copiar el código al portapapeles
import { Component, signal } from "@angular/core";import { useIntlayer } from "angular-intlayer";@Component({ selector: "app-hello-world", standalone: true, template: ` <h1>{{ content().title }}</h1> <div class="card"> <button type="button" (click)="increment()"> {{ content().count }} {{ count() }} </button> <p [innerHTML]="content().edit"></p> </div> <p class="read-the-docs">{{ content().readTheDocs }}</p> `,})export class HelloWorldComponent { content = useIntlayer("helloworld"); count = signal(0); increment() { this.count.update((value) => value + 1); }}
El contenido de Intlayer se devuelve como una Signal, por lo que accedes a los valores llamando a la señal en tu plantilla: content().title.
(Opcional) Paso 6: Cambiar el idioma de tu contenido
Para cambiar el idioma de tu contenido, puedes usar la función setLocale proporcionada por la función useLocale. Esto te permite establecer la configuración regional de la aplicación y actualizar el contenido en consecuencia.
Crea un componente para cambiar entre idiomas:
Copiar el código al portapapeles
import { Component } from "@angular/core";import { CommonModule } from "@angular/common";import { getLocaleName } from "intlayer";import { useLocale } from "angular-intlayer";import { FormsModule } from "@angular/forms";@Component({ selector: "app-locale-switcher", standalone: true, imports: [CommonModule, FormsModule], template: ` <div class="locale-switcher"> <select [ngModel]="locale()" (ngModelChange)="changeLocale($event)"> <option *ngFor="let loc of availableLocales" [value]="loc"> {{ getLocaleName(loc) }} </option> </select> </div> `,})export class LocaleSwitcherComponent { localeInfo = useLocale(); locale = this.localeInfo.locale; availableLocales = this.localeInfo.availableLocales; // Exponer getLocaleName a la plantilla getLocaleName = getLocaleName; changeLocale(newLocale: string) { this.localeInfo.setLocale(newLocale); }}
Luego, usa este componente en tu app.component.ts:
Copiar el código al portapapeles
import { Component } from "@angular/core";import { HelloWorldComponent } from "./hello-world.component";import { LocaleSwitcherComponent } from "./components/locale-switcher.component";@Component({ selector: "app-root", standalone: true, imports: [HelloWorldComponent, LocaleSwitcherComponent], template: ` <div> <app-locale-switcher /> <a href="https://vite.dev" target="_blank"> <img src="/vite.svg" class="logo" alt="Logotipo de Vite" /> </a> <a href="https://angular.dev/" target="_blank"> <img src="/assets/angular.svg" class="logo angular" alt="Logotipo de Angular" /> </a> </div> <app-hello-world /> `,})export class AppComponent {}
(Opcional) Paso 7: Añade enrutamiento localizado a tu aplicación
Añadir enrutamiento localizado en una aplicación Angular implica usar el Angular Router con prefijos de locales. Esto crea rutas únicas para cada idioma, lo cual es útil para SEO.
Ejemplo:
Copiar el código al portapapeles
- https://example.com/about- https://example.com/es/about- https://example.com/fr/about
Primero, asegúrate de tener instalado @angular/router.
Luego, crea una configuración de rutas que maneje el enrutamiento basado en locales en app.routes.ts.
Copiar el código al portapapeles
import { Routes } from "@angular/router";import { configuration, localeFlatMap } from "intlayer";import { HomeComponent } from "./home/home.component";import { RootComponent } from "./root/root.component";const { defaultLocale } = configuration.internationalization;export const routes: Routes = [ localeFlatMap((localizedData) => [ { path: `${localizedData.urlPrefix}`, component: RootComponent, data: { locale: localizedData.locale }, }, { path: `${localizedData.urlPrefix}/home`, component: HomeComponent, data: { locale: localizedData.locale }, }, ]), { path: "**", redirectTo: `/${defaultLocale}/home` },];
Luego, debes proporcionar el router en tu app.config.ts.
Copiar el código al portapapeles
import { ApplicationConfig } from "@angular/core";import { provideRouter } from "@angular/router";import { routes } from "./app.routes";export const appConfig: ApplicationConfig = { providers: [provideRouter(routes)],};
(Opcional) Paso 8: Cambiar la URL cuando cambia el locale
Para actualizar automáticamente la URL cuando el usuario cambia el idioma, puedes modificar el componente LocaleSwitcher para usar el Router de Angular:
Copiar el código al portapapeles
import { Component, inject } from "@angular/core";import { CommonModule } from "@angular/common";import { Router } from "@angular/router";import { getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale } from "angular-intlayer";import { FormsModule } from "@angular/forms";@Component({ selector: "app-locale-switcher", standalone: true, imports: [CommonModule, FormsModule], template: ` <div class="locale-switcher"> <select [ngModel]="locale()" (ngModelChange)="changeLocale($event)"> <option *ngFor="let loc of availableLocales" [value]="loc"> {{ getLocaleName(loc) }} </option> </select> </div> `,})export class LocaleSwitcherComponent { private router = inject(Router); localeInfo = useLocale({ onLocaleChange: (newLocale) => { const currentPath = this.router.url; const localizedPath = getLocalizedUrl(currentPath, newLocale); this.router.navigateByUrl(localizedPath); }, }); locale = this.localeInfo.locale; availableLocales = this.localeInfo.availableLocales; getLocaleName = getLocaleName; changeLocale(newLocale: string) { this.localeInfo.setLocale(newLocale); }}
(Opcional) Paso 9: Cambiar los atributos de idioma y dirección del HTML
Cuando tu aplicación soporta múltiples idiomas, es crucial actualizar los atributos lang y dir de la etiqueta <html> para que coincidan con la configuración regional actual.
Puedes crear un servicio para manejar esto automáticamente.
Copiar el código al portapapeles
import { Injectable, effect } from "@angular/core";import { useLocale } from "angular-intlayer";import { getHTMLTextDir } from "intlayer";@Injectable({ providedIn: "root",})export class I18nHtmlAttributesService { private localeInfo = useLocale(); constructor() { effect(() => { const newLocale = this.localeInfo.locale(); if (newLocale) { document.documentElement.lang = newLocale; document.documentElement.dir = getHTMLTextDir(newLocale); } }); } // Este método puede ser llamado en el componente raíz de la aplicación para asegurar que el servicio esté inicializado. init() {}}
Luego, inyecta e inicializa este servicio en tu componente principal AppComponent:
Copiar el código al portapapeles
import { Component, inject } from "@angular/core";// ... otras importacionesimport { I18nHtmlAttributesService } from "./services/i18n-html-attributes.service";@Component({ // ...})export class AppComponent { constructor() { inject(I18nHtmlAttributesService).init(); }}
(Opcional) Paso 10: Crear una directiva de enlace localizada
Para asegurarte de que la navegación de tu aplicación respeta la configuración regional actual, puedes crear una directiva personalizada. Esta directiva añade automáticamente el prefijo del idioma actual a las URLs internas.
Copiar el código al portapapeles
import { Directive, Input, HostBinding, inject } from "@angular/core";import { getLocalizedUrl } from "intlayer";import { useLocale } from "angular-intlayer";@Directive({ selector: "a[appLocalizedLink]", standalone: true,})export class LocalizedLinkDirective { @Input("href") originalHref: string = ""; private localeInfo = useLocale(); @HostBinding("href") get localizedHref(): string { const locale = this.localeInfo.locale(); const isExternalLink = /^https?:\/\//.test(this.originalHref); if (isExternalLink || !this.originalHref) { return this.originalHref; } return getLocalizedUrl(this.originalHref, locale); }}
Para usarlo, añade la directiva appLocalizedLink a tus etiquetas anchor y asegúrate de importarla en tu componente.
Copiar el código al portapapeles
// ...import { LocalizedLinkDirective } from "./directives/localized-link.directive";@Component({ selector: "app-root", standalone: true, imports: [/*...,*/ LocalizedLinkDirective], template: ` <a href="/home" appLocalizedLink>Inicio</a> `,})export class AppComponent {}
(Opcional) Paso 11: Renderizar Markdown
Intlayer soporta la renderización de contenido Markdown. Para convertir Markdown en HTML enriquecido, puedes integrar markdown-it.
Primero, instala markdown-it:
Copiar el código al portapapeles
npm install markdown-it# y sus tiposnpm install -D @types/markdown-it
A continuación, configura el INTLAYER_MARKDOWN_TOKEN en tu app.config.ts.
Copiar el código al portapapeles
import { ApplicationConfig } from "@angular/core";import { provideRouter } from "@angular/router";import { routes } from "./app.routes";import { createIntlayerMarkdownProvider } from "angular-intlayer/markdown";import MarkdownIt from "markdown-it";const md = new MarkdownIt({ html: true, linkify: true, typographer: true,});export const appConfig: ApplicationConfig = { providers: [ provideRouter(routes), createIntlayerMarkdownProvider((markdown) => md.render(markdown)), ],};
Por defecto, Intlayer devolverá el HTML renderizado como una cadena. Si usas [innerHTML] para enlazarlo, ten en cuenta las implicaciones de seguridad (XSS). Siempre asegúrate de que tu contenido provenga de una fuente confiable.
Para escenarios más complejos, puedes crear un pipe para renderizar el HTML de forma segura.
Configurar TypeScript
Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer tu base de código.
Asegúrate de que tu configuración de TypeScript incluya los tipos autogenerados.
Copiar el código al portapapeles
{ // ... Tus configuraciones existentes de TypeScript "include": [ // ... Tus configuraciones existentes de TypeScript ".intlayer/**/*.ts", // Incluir los tipos generados automáticamente ],}
Configuración de Git
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio Git.
Para hacerlo, puedes añadir las siguientes instrucciones a tu archivo .gitignore:
Copiar el código al portapapeles
# Ignorar los archivos generados por Intlayer.intlayer
Extensión de VS Code
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la Extensión oficial de Intlayer para VS Code.
Instalar desde el Marketplace de VS Code Esta extensión proporciona:
- Autocompletado para las claves de traducción.
- Detección de errores en tiempo real para traducciones faltantes.
- Previsualizaciones en línea del contenido traducido.
- Acciones rápidas para crear y actualizar traducciones fácilmente.
Para más detalles sobre cómo usar la extensión, consulta la documentación de la extensión Intlayer para VS Code.
Ir más allá
Para ir más allá, puedes implementar el editor visual o externalizar tu contenido usando el CMS.
Historial del documento
- 5.5.10 - 2025-06-29: Historial inicial