Configuración de internacionalización (i18n) en Angular con PrimeNG

La implemantación de un sistema multi-idioma en aplicaciones Angular permite adaptar la interfaz de usuario a diferentes regiones de forma dinámica. Para integrar esta funcionalidad con los componentes de PrimeNG, se utiliza habitualmente la librería @ngx-translate.

1. Instalación de dependencias

Es necesario instalar el núcleo de traducción y el cargador HTTP para gestionar los archivos de recursos externos:

npm install @ngx-translate/core @ngx-translate/http-loader --save

2. Definición de archivos de recursos

Cree una estructura de archivos JSON dentro de la carpeta assets/i18n/ para almacenar las claves de traducción. Por ejemplo:

es.json (Español)

{
    "btn.confirm": "Confirmar",
    "btn.cancel": "Cancelar",
    "label.switch_es": "Cambiar a Español",
    "label.switch_en": "Cambiar a Inglés"
}

en.json (Inglés)

{
    "btn.confirm": "Confirm",
    "btn.cancel": "Cancel",
    "label.switch_es": "Switch to Spanish",
    "label.switch_en": "Switch to English"
}

3. Configuración del módulo principal

En el archivo app.module.ts, se debe configurar el TranslateModule definiendo un cargador que busque los archivos JSON mediante peticiones HTTP.

import { NgModule } from '@angular/core';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';

// Función para cargar los archivos de traducción
export function createTranslateLoader(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/', '.json');
}

@NgModule({
  imports: [
    HttpClientModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: createTranslateLoader,
        deps: [HttpClient]
      }
    })
  ]
})
export class AppModule { }

4. Lógica de cambio de idioma en componentes

Para gestionar el cambio de idioma y sincronizar los componentes de PrimeNG, se inyectan los servicios TranslateService y PrimeNGConfig. El servicio de PrimeNG permite traducir etiquetas inetrnas de sus componentes (como meses del calendario o filtros).

import { Component, OnInit } from '@angular/core';
import { PrimeNGConfig } from 'primeng/api';
import { TranslateService } from '@ngx-translate/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {

  constructor(
    private translate: TranslateService, 
    private primengConfig: PrimeNGConfig
  ) {
    // Idioma por defecto
    this.translate.setDefaultLang('es');
  }

  ngOnInit() {
    // Sincronizar PrimeNG con las traducciones actuales
    this.translate.get('primeng').subscribe(res => {
      this.primengConfig.setTranslation(res);
    });
  }

  updateLanguage(lang: string) {
    this.translate.use(lang);
  }
}

5. Uso en el template HTML

Se puede emplear el pipe translate para mostrar las etiquetas dinámicamente en los botones y componentes de PrimeNG.

<div class="actions">
  <p-button 
    label="{{ 'label.switch_es' | translate }}" 
    (onClick)="updateLanguage('es')">
  </p-button>

  <p-button 
    label="{{ 'label.switch_en' | translate }}" 
    (onClick)="updateLanguage('en')" 
    styleClass="p-button-secondary">
  </p-button>
</div>

<hr>

<div>
  <button pButton type="button" [label]="'btn.confirm' | translate"></button>
</div>

Gestión de estado del idioma

En aplicaciones de producción, es recomendable perisstir la elección del usuario. Una práctica común consiste en almacenar el código del idioma en el localStorage del navegador. Al iniciar la aplicación, se puede verificar si existe una preferencia guardada antes de aplicar el idioma por defecto.

const userLang = localStorage.getItem('app_lang') || 'es';
this.translate.use(userLang);

Etiquetas: angular PrimeNG ngx-translate internationalization TypeScript

Publicado el 6-23 02:46