Skip to content

Commit 4620591

Browse files
committed
Fix translate. Create translate loaders: "browser" and "server". Rename BrowserAppModule > AppBrowserModule
1 parent e1c3660 commit 4620591

File tree

7 files changed

+124
-61
lines changed

7 files changed

+124
-61
lines changed

src/app/app.browser.module.ts

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,52 @@
1-
import { CookieStorage } from './../forStorage/browser.storage';
2-
import { AppStorage } from './../forStorage/universal.inject';
3-
import { BrowserTransferStateModule } from '@angular/platform-browser';
1+
// angular
42
import { NgModule } from '@angular/core';
5-
import { BrowserModule } from '@angular/platform-browser';
3+
import { BrowserModule, BrowserTransferStateModule, TransferState } from '@angular/platform-browser';
4+
import { HttpClient } from '@angular/common/http';
5+
// libs
6+
import { TransferHttpCacheModule } from '@nguniversal/common';
7+
import { REQUEST } from '@nguniversal/express-engine/tokens';
8+
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
9+
// shared
10+
import { CookieStorage } from '../forStorage/browser.storage';
11+
import { AppStorage } from '../forStorage/universal.inject';
12+
// components
13+
import { TranslateBrowserLoader } from './translate-browser-loader.service';
614
import { AppComponent } from './app.component';
715
import { AppModule } from './app.module';
8-
import { REQUEST } from '@nguniversal/express-engine/tokens';
16+
917
// import { ServiceWorkerModule } from '@angular/service-worker';
1018

19+
// the Request object only lives on the server
1120
export function getRequest(): any {
12-
// the Request object only lives on the server
13-
const result = { headers: { cookie: document.cookie } };
21+
return { headers: { cookie: document.cookie } };
22+
}
1423

15-
return result;
24+
export function exportTranslateStaticLoader(http: HttpClient, transferState: TransferState): TranslateBrowserLoader {
25+
return new TranslateBrowserLoader('/assets/i18n/', '.json', transferState, http);
1626
}
1727

1828
@NgModule({
19-
bootstrap: [ AppComponent ],
29+
bootstrap: [AppComponent],
2030
imports: [
21-
BrowserModule.withServerTransition({
22-
appId: 'my-app'
23-
}),
31+
BrowserModule.withServerTransition({ appId: 'my-app' }),
32+
TransferHttpCacheModule,
2433
BrowserTransferStateModule,
34+
TranslateModule.forRoot({
35+
loader: {
36+
provide: TranslateLoader,
37+
useFactory: exportTranslateStaticLoader,
38+
deps: [HttpClient, TransferState]
39+
}
40+
}
41+
),
2542
// ServiceWorkerModule.register('/ngsw-worker.js'),
2643
AppModule,
2744
],
2845
providers: [
29-
{
30-
// The server provides these in main.server
31-
provide: REQUEST,
32-
useFactory: (getRequest)
46+
{
47+
// The server provides these in main.server
48+
provide: REQUEST,
49+
useFactory: (getRequest)
3350
},
3451
{ provide: AppStorage, useClass: CookieStorage },
3552
{
@@ -38,4 +55,5 @@ export function getRequest(): any {
3855
}
3956
]
4057
})
41-
export class BrowserAppModule {}
58+
export class AppBrowserModule {
59+
}

src/app/app.server.module.ts

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
1-
import { UniversalStorage } from './../forStorage/server.storage';
2-
import { AppStorage } from './../forStorage/universal.inject';
3-
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
1+
// angular
42
import { NgModule } from '@angular/core';
5-
import { ServerModule } from '@angular/platform-server';
6-
import { AppComponent } from './app.component';
7-
import { AppModule } from './app.module';
8-
import 'rxjs/add/operator/filter';
9-
import 'rxjs/add/operator/first';
3+
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server';
4+
import { TransferState } from '@angular/platform-browser';
5+
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
6+
// libs
107
import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader';
11-
import { ServerTransferStateModule } from '@angular/platform-server';
128
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
13-
import { Observable } from 'rxjs/Observable';
14-
15-
const fs = require('fs');
16-
17-
export class TranslateUniversalLoader implements TranslateLoader {
18-
constructor(private prefix: string = 'i18n', private suffix: string = '.json') {
19-
}
9+
import 'rxjs/add/operator/filter';
10+
import 'rxjs/add/operator/first';
11+
// shared
12+
import { UniversalStorage } from '../forStorage/server.storage';
13+
import { AppStorage } from '../forStorage/universal.inject';
14+
// components
15+
import { TranslateServerLoader } from './translate-server-loader.service';
16+
import { AppComponent } from './app.component';
17+
import { AppModule } from './app.module';
2018

21-
public getTranslation(lang: string): Observable<any> {
22-
return Observable.create(observer => {
23-
observer.next(JSON.parse(fs.readFileSync(`${this.prefix}/${lang}${this.suffix}`, 'utf8')));
24-
observer.complete();
25-
});
26-
}
27-
}
2819

29-
export function translateFactory() {
30-
return new TranslateUniversalLoader('./dist/assets/i18n', '.json');
20+
export function translateFactory(transferState: TransferState): TranslateServerLoader {
21+
return new TranslateServerLoader('./dist/assets/i18n', '.json', transferState);
3122
}
3223

3324
@NgModule({
@@ -40,7 +31,8 @@ export function translateFactory() {
4031
TranslateModule.forRoot({
4132
loader: {
4233
provide: TranslateLoader,
43-
useFactory: translateFactory
34+
useFactory: translateFactory,
35+
deps: [TransferState]
4436
}
4537
}),
4638
],
@@ -51,4 +43,5 @@ export function translateFactory() {
5143
}
5244
],
5345
})
54-
export class AppServerModule { }
46+
export class AppServerModule {
47+
}

src/app/shared/translates/translates.module.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@ import { TranslateHttpLoader } from '@ngx-translate/http-loader';
55

66
import { TranslatesService } from './translates.service';
77

8-
export function httpLoaderFactory(http: HttpClient) {
9-
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
10-
}
8+
// export function httpLoaderFactory(http: HttpClient) {
9+
// return new TranslateHttpLoader(http, './assets/i18n/', '.json');
10+
// }
1111

1212
@NgModule({
1313
imports: [
14-
TranslateModule.forRoot({
15-
loader: {
16-
provide: TranslateLoader,
17-
useFactory: httpLoaderFactory,
18-
deps: [HttpClient]
19-
}
20-
}
21-
)
14+
// TranslateModule.forRoot({
15+
// loader: {
16+
// provide: TranslateLoader,
17+
// useFactory: httpLoaderFactory,
18+
// deps: [HttpClient]
19+
// }
20+
// }
21+
// )
2222
],
2323
providers: [TranslatesService]
2424
})

src/app/shared/translates/translates.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ const DEFAULT_LANG: string = 'en';
99
export class TranslatesService {
1010
constructor(private _translateService: TranslateService,
1111
@Inject(AppStorage) private appStorage: Storage) {
12-
this._translateService.addLangs(LANG_LIST);
13-
this._translateService.setDefaultLang(DEFAULT_LANG);
12+
// this._translateService.addLangs(LANG_LIST);
13+
// this._translateService.setDefaultLang(DEFAULT_LANG);
1414
this._translateService.use(this.appStorage.getItem('lang') || DEFAULT_LANG);
1515
}
1616

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// angular
2+
import { HttpClient } from '@angular/common/http';
3+
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
4+
// libs
5+
import { TranslateLoader } from '@ngx-translate/core';
6+
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
7+
import { Observable } from 'rxjs/Observable';
8+
9+
export class TranslateBrowserLoader implements TranslateLoader {
10+
constructor(private prefix: string = 'i18n',
11+
private suffix: string = '.json',
12+
private transferState: TransferState,
13+
private http: HttpClient) {
14+
}
15+
16+
public getTranslation(lang: string): Observable<any> {
17+
const key: StateKey<number> = makeStateKey<number>('transfer-translate-' + lang);
18+
const data = this.transferState.get(key, null);
19+
if (data) {
20+
return Observable.create(observer => {
21+
observer.next(data);
22+
observer.complete();
23+
});
24+
} else {
25+
return new TranslateHttpLoader(this.http, this.prefix, this.suffix).getTranslation(lang);
26+
}
27+
}
28+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// angular
2+
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
3+
// libs
4+
import { TranslateLoader } from '@ngx-translate/core';
5+
import { Observable } from 'rxjs/Observable';
6+
7+
const fs = require('fs');
8+
9+
export class TranslateServerLoader implements TranslateLoader {
10+
constructor(private prefix: string = 'i18n',
11+
private suffix: string = '.json',
12+
private transferState: TransferState) {
13+
}
14+
15+
public getTranslation(lang: string): Observable<any> {
16+
return Observable.create(observer => {
17+
const jsonData = JSON.parse(fs.readFileSync(`${this.prefix}/${lang}${this.suffix}`, 'utf8'));
18+
const key: StateKey<number> = makeStateKey<number>('transfer-translate-' + lang);
19+
this.transferState.set(key, jsonData);
20+
observer.next(jsonData);
21+
observer.complete();
22+
});
23+
}
24+
}

src/main.browser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import { enableProdMode } from '@angular/core';
22
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
33

44
import { environment } from './environments/environment';
5-
// import { AppModule } from './app/app.module';
6-
import { BrowserAppModule } from './app/app.browser.module';
7-
// import 'hammerjs';
5+
import { AppBrowserModule } from './app/app.browser.module';
86

97
if (environment.production) {
108
enableProdMode();
119
}
1210

13-
platformBrowserDynamic().bootstrapModule(BrowserAppModule);
11+
document.addEventListener('DOMContentLoaded', () => {
12+
platformBrowserDynamic().bootstrapModule(AppBrowserModule).catch(err => console.log(err));
13+
});

0 commit comments

Comments
 (0)