Hola a todos, hoy vamos a aprender como crear una app multi idioma con Ionic.
Como siempre vamos a crear una app de ejemplo así que desde consola creamos un nuevo proyecto al que vamos a llamar ejemploidioma:
ionic start ejemploidioma blank --cordova
Con –cordova le indicamos que incluya apache cordova para poder generar el código para android e ios.
Para crear un app multi idioma con Ionic vamos a instalar la librería ngx-translate:
npm install npm install @ngx-translate/core @ngx-translate/http-loader --save
Ahora en app.module.ts tenemos que añadir los siguientes imports:
import { TranslateModule, TranslateLoader } from "@ngx-translate/core"; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; import { HttpClient, HttpClientModule } from "@angular/common/http";
Justo debajo de los imports, antes de @NgModule añadimos el siguiente código:
export function HttpLoaderFactory(httpClient: HttpClient) { return new TranslateHttpLoader(httpClient, "../assets/i18n/", ".json"); }
Por último declaramos dentro de imports lo que esta marcado en amarillo:
@NgModule({ declarations: [ MyApp, HomePage ], imports: [ BrowserModule, IonicModule.forRoot(MyApp), HttpClientModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, deps: [HttpClient] } }) ], bootstrap: [IonicApp], entryComponents: [ MyApp, HomePage ], providers: [ StatusBar, SplashScreen, {provide: ErrorHandler, useClass: IonicErrorHandler} ] })
El código completo de app.module.ts quedaría de la siguiente manera:
import { BrowserModule } from '@angular/platform-browser'; import { ErrorHandler, NgModule } from '@angular/core'; import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; import { SplashScreen } from '@ionic-native/splash-screen'; import { StatusBar } from '@ionic-native/status-bar'; import { MyApp } from './app.component'; import { HomePage } from '../pages/home/home'; import { TranslateModule, TranslateLoader } from "@ngx-translate/core"; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; import { HttpClient, HttpClientModule } from "@angular/common/http"; export function HttpLoaderFactory(httpClient: HttpClient) { return new TranslateHttpLoader(httpClient, "../assets/i18n/", ".json"); } @NgModule({ declarations: [ MyApp, HomePage ], imports: [ BrowserModule, IonicModule.forRoot(MyApp), HttpClientModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: HttpLoaderFactory, deps: [HttpClient] } }) ], bootstrap: [IonicApp], entryComponents: [ MyApp, HomePage ], providers: [ StatusBar, SplashScreen, {provide: ErrorHandler, useClass: IonicErrorHandler} ] }) export class AppModule {}
Ahora vamos a editar app.component.ts y añadimos el siguiente código:
import { Component } from '@angular/core'; import { Platform } from 'ionic-angular'; import { StatusBar } from '@ionic-native/status-bar'; import { SplashScreen } from '@ionic-native/splash-screen'; import { TranslateService } from '@ngx-translate/core'; import { HomePage } from '../pages/home/home'; @Component({ templateUrl: 'app.html' }) export class MyApp { rootPage:any = HomePage; constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, private translateService: TranslateService) { platform.ready().then(() => { // Okay, so the platform is ready and our plugins are available. // Here you can do any higher level native things you might need. this.translateService.setDefaultLang('es'); this.translateService.use('es'); statusBar.styleDefault(); splashScreen.hide(); }); } }
Con this.translateService.setDefaultLang(‘es’); le idicamos que el idioma por defecto es el español y con this.translateService.use(‘es’); hacemos que sea el idioma seleccionado.
Dentro de la carpeta src/assets vamos a crear una carpeta llamada i18n y dentro de esta situaremos los archivos con los literales en los diferentes idiomas, en este ejemplo vamos a usar inglés y español, por lo que vamos a crear dos archivos llamados en.json para inglés y es.json para español:
En en.json pondremos lo siguiente:
{ "HOLA": "Hi {{ value }}", "IDIOMA": "Language", "BIENVENIDO" : "Welcome" }
Y en es.json:
{ "HOLA": "Hola {{ value }}", "IDIOMA": "Idioma", "BIENVENIDO" : "Bienvenido" }
Como puedes observar es un archivo en formato json donde la clave es lo que escribiremos en la vista y el valor es lo que se mostrará en función del idioma seleccionado.
Como puedes ver HOLA se traduce como “Hola {{ value }}”, donde value se sustituirá por el valor pasado, veremos un poco más adelante como se utiliza.
Ya estamos preparados para traducir nuestra app.
Vamos a modificar home.html y vamos a crear un ejemplo sencillo donde vamos a tener un elemento ion-card que simplemente nos da la Bienvenida y nos saluda y un selector para cambiar de idioma:
<ion-header> <ion-navbar> <ion-title> Ejemplo Idioma </ion-title> </ion-navbar> </ion-header> <ion-content padding> <ion-card> <ion-card-header text-center> {{ 'BIENVENIDO' | translate }} </ion-card-header> <ion-card-content> <p text-center> {{ 'HOLA' | translate:{value: 'Eduardo'} }} </p> </ion-card-content> </ion-card> <ion-item> <ion-label>{{ 'IDIOMA' | translate }} </ion-label> <ion-select [(ngModel)]="idioma" (ionChange)="cambioIdioma($event)"> <ion-option value="es">Español</ion-option> <ion-option value="en">Inglés</ion-option> </ion-select> </ion-item> </ion-content>
Como vemos en la etiqueta ion-select le decimos que en el evento (ionChange) llame a la función cambioIdioma($event), $event contendrá la opción seleccionada.
Para traducir las cadenas al idioma seleccionado utilizamos en pipe o barra vertical ‘|’ seguido de la palabra translate que es filtro que se aplica.
Como comenté antes podemos pasarle un valor al filtro translate de la siguiente manera:
{{ ‘HOLA’ | translate:{value: ‘Eduardo’} }}
Con esto le estamos diciendo que traduzca la cadena HOLA y le pase al fintro el value ‘Eduardo’.
Al ir a buscar el valor en el archivo json sustituirá valúe por ‘Eduardo’:
“HOLA”: “Hi {{ value }}”,
Esto puede servirnos de ayuda cuando queremos traducir cadenas mostrando un valor que dependiendo del idioma se debe mostrar en una posición diferente de la cadena, por ejemplo la frase “Este es el coche de Eduardo” en inglés sería “this is Eduardo’s car”.
Por lo tanto en inglés podríamos pasarle el nombre y traducirlo así:
“this is {{ value }}’s car”,
Mientras que en español sería
“Este es el coche de {{ value }}”
Bien, ahora solo nos queda definir la función cambioIdioma en el controlador home.ts, para poder cambiar de idioma necesitaremos importar TranslateService e inyectarlo en el constructor:
import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { constructor(public navCtrl: NavController, private translateService: TranslateService) { } cambioIdioma(selectedValue){ this.translateService.use(selectedValue); } }
Con selectedValue es el idioma que hemos seleccionado en el select y con this.translateService.use(selectedValue) le estamos diciendo que utilice el idioma que le pasamos.
Ya podemos probar nuestro pequeño ejemplo, ejecutando ionic serve -l desde consola veremos algo como esto en nuestro navegador:
Por último, como extra si desde el controlador necesitamos traducir una cadena podemos utilizar this.translateService.instant().
this.loading = this.loadingCtrl.create({ content: this.translateService.instant('Cargando'), spinner: 'dots', });
Si necesitas desarrollar una aplicación móvil no dudes en solicitarme un presupuesto sin compromiso:
Un saludo, y si aún no lo has hecho no olvides suscribirte a mi blog para no perderte los próximos posts :-),También puedes seguirme en Twitter en @revigames y no olvides que me ayudas mucho si compartes este post en las redes sociales.
Hola, Gracias por tu tiempo.
Porque en el ionic serve –lab aparece la tradición pero en el telefono no?