Skip to content

Commit a6cd095

Browse files
Ismaestroiramos
authored andcommitted
feat(i18n): added internationalization ng2 translate plugin
1 parent 021a43c commit a6cd095

20 files changed

Lines changed: 167 additions & 50 deletions

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"core-js": "^2.4.1",
2727
"font-awesome": "^4.7.0",
2828
"json-server": "^0.9.4",
29+
"ng2-translate": "^5.0.0",
2930
"rxjs": "^5.0.1",
3031
"ts-helpers": "^1.1.1",
3132
"zone.js": "^0.7.2"

src/app/app.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<div class="container">
2-
<toh-nav [title]="'Tour of heroes'"></toh-nav>
2+
<toh-nav [title]="'tourOfHeroes' | translate"></toh-nav>
33
<router-outlet></router-outlet>
44
</div>
55
<footer class="footer">
66
<div class="container">
7-
<span class="text-muted">Tour of heroes @2016.</span>
7+
<span class="text-muted">{{ 'tourOfHeroes' | translate }} @2016.</span>
88
</div>
99
</footer>

src/app/app.component.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import {Component, Inject} from '@angular/core';
2-
3-
import {APP_CONFIG} from './config/app.config';
4-
import {IAppConfig} from './config/iapp.config';
1+
import {Component} from '@angular/core';
2+
import {TranslateService} from 'ng2-translate';
53

64
@Component({
75
selector: 'toh-app',
86
templateUrl: './app.component.html'
97
})
108

119
export class AppComponent {
12-
title: string;
10+
private translateService: TranslateService;
1311

14-
constructor(@Inject(APP_CONFIG) private appConfig: IAppConfig) {
15-
this.title = this.appConfig.title;
12+
constructor(translateService: TranslateService) {
13+
this.translateService = translateService;
14+
this.translateService.setDefaultLang('en');
15+
this.translateService.use('en');
1616
}
1717
}

src/app/app.module.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import {NgModule} from '@angular/core';
2-
import {BrowserModule} from '@angular/platform-browser';
3-
import {FormsModule} from '@angular/forms';
4-
import {HttpModule} from '@angular/http';
1+
import {NgModule} from '@angular/core';
2+
import {BrowserModule} from '@angular/platform-browser';
3+
import {FormsModule} from '@angular/forms';
4+
import {Http, HttpModule} from '@angular/http';
5+
import {TranslateModule, TranslateLoader} from 'ng2-translate';
6+
import {TranslateLoaderFactory} from './app.translate.factory';
57

68
import {APP_CONFIG, AppConfig} from './config/app.config';
79

@@ -18,6 +20,11 @@ import {HeroTopComponent} from './heroes/hero-top/hero-top.component';
1820
BrowserModule,
1921
FormsModule,
2022
HttpModule,
23+
TranslateModule.forRoot({
24+
provide: TranslateLoader,
25+
useFactory: TranslateLoaderFactory,
26+
deps: [Http]
27+
}),
2128
AppRoutingModule,
2229
CoreModule,
2330
HeroesModule,

src/app/app.translate.factory.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {TranslateStaticLoader} from 'ng2-translate';
2+
3+
export function TranslateLoaderFactory(http: any) {
4+
return new TranslateStaticLoader(http, '/assets/i18n', '.json');
5+
}

src/app/config/app.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export let APP_CONFIG = new OpaqueToken('app.config');
66

77
let heroesRoute = 'heroes';
88
export const AppConfig: IAppConfig = {
9-
title: 'Tour of Heroes',
109
routes: {
1110
heroes: heroesRoute,
1211
heroById: heroesRoute + '/:id'

src/app/config/iapp.config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export interface IAppConfig {
22
routes: any;
33
endpoints: any;
4-
title: string;
54
}

src/app/core/core.module.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
import {NgModule, Optional, SkipSelf} from '@angular/core';
2-
import {CommonModule} from '@angular/common';
3-
import {FormsModule} from '@angular/forms';
1+
import {NgModule, Optional, SkipSelf} from '@angular/core';
2+
import {CommonModule} from '@angular/common';
3+
import {FormsModule} from '@angular/forms';
4+
import {Http} from '@angular/http';
5+
import {TranslateModule, TranslateLoader} from 'ng2-translate';
6+
import {TranslateLoaderFactory} from '../app.translate.factory';
47

58
import {throwIfAlreadyLoaded} from './module-import-guard';
69
import {LoggerService} from './logger.service';
@@ -10,12 +13,18 @@ import {HeroRoutingModule} from '../heroes/heroes-routing.module';
1013

1114
import {NavComponent} from './nav/nav.component';
1215

16+
1317
@NgModule({
1418
imports: [
1519
CommonModule,
1620
FormsModule,
1721
HeroRoutingModule,
18-
HeroesModule
22+
HeroesModule,
23+
TranslateModule.forRoot({
24+
provide: TranslateLoader,
25+
useFactory: TranslateLoaderFactory,
26+
deps: [Http]
27+
}),
1928
],
2029
exports: [
2130
NavComponent

src/app/core/nav/nav.component.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99
</li>
1010
</ul>
1111
</div>
12+
<div class="dropdown">
13+
<a class="btn btn-secondary dropdown-toggle" id="dropdownMenuLink" data-toggle="dropdown"
14+
aria-haspopup="true" aria-expanded="false">
15+
<i class="fa fa-globe" aria-hidden="true"></i> {{ 'language' | translate }}
16+
</a>
17+
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
18+
<a class="dropdown-item" (click)="changeLanguage('en')">{{ 'english' | translate }}</a>
19+
<a class="dropdown-item" (click)="changeLanguage('es')">{{ 'spanish' | translate }}</a>
20+
</div>
21+
</div>
1222
<toh-hero-search></toh-hero-search>
1323
</nav>
1424
</header>

src/app/core/nav/nav.component.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {Component, Inject, Input} from '@angular/core';
2+
import {TranslateService} from 'ng2-translate';
23

34
import {APP_CONFIG} from '../../config/app.config';
45
import {IAppConfig} from '../../config/iapp.config';
@@ -14,10 +15,25 @@ export class NavComponent {
1415

1516
menuItems: any[];
1617

17-
constructor(@Inject(APP_CONFIG) private appConfig: IAppConfig) {
18-
this.menuItems = [
19-
{link: '/', name: 'Home'},
20-
{link: '/' + appConfig.routes.heroes, name: 'Heroes list'}
21-
];
18+
private translateService: TranslateService;
19+
20+
private loadMenus(): void {
21+
this.translateService.get(['home', 'heroesList'], {}).subscribe((texts: string) => {
22+
this.menuItems = [
23+
{link: '/', name: texts['home']},
24+
{link: '/' + this.appConfig.routes.heroes, name: texts['heroesList']}
25+
];
26+
});
27+
}
28+
29+
constructor(@Inject(APP_CONFIG) private appConfig: IAppConfig,
30+
translateService: TranslateService) {
31+
this.translateService = translateService;
32+
this.loadMenus();
33+
}
34+
35+
changeLanguage(language: string): void {
36+
this.translateService.use(language);
37+
this.loadMenus();
2238
}
2339
}

0 commit comments

Comments
 (0)