Skip to content

Commit 0216dd8

Browse files
authored
Merge pull request #33 from Stivin/fix_translate
Убрал дерганье при загрузки приложение (повторные запросы для переводов)
2 parents 0694228 + c3ea591 commit 0216dd8

File tree

13 files changed

+164
-98
lines changed

13 files changed

+164
-98
lines changed

src/app/app.browser.module.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,39 @@
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 } from '@angular/platform-browser';
4+
// libs
5+
import { TransferHttpCacheModule } from '@nguniversal/common';
6+
import { REQUEST } from '@nguniversal/express-engine/tokens';
7+
// shared
8+
import { CookieStorage } from '../forStorage/browser.storage';
9+
import { AppStorage } from '../forStorage/universal.inject';
10+
// components
611
import { AppComponent } from './app.component';
712
import { AppModule } from './app.module';
8-
import { REQUEST } from '@nguniversal/express-engine/tokens';
13+
import { TranslatesBrowserModule } from '@shared/translates/translates-browser';
14+
915
// import { ServiceWorkerModule } from '@angular/service-worker';
1016

17+
// the Request object only lives on the server
1118
export function getRequest(): any {
12-
// the Request object only lives on the server
13-
const result = { headers: { cookie: document.cookie } };
14-
15-
return result;
19+
return { headers: { cookie: document.cookie } };
1620
}
1721

1822
@NgModule({
19-
bootstrap: [ AppComponent ],
23+
bootstrap: [AppComponent],
2024
imports: [
21-
BrowserModule.withServerTransition({
22-
appId: 'my-app'
23-
}),
25+
BrowserModule.withServerTransition({ appId: 'my-app' }),
26+
TransferHttpCacheModule,
2427
BrowserTransferStateModule,
2528
// ServiceWorkerModule.register('/ngsw-worker.js'),
2629
AppModule,
30+
TranslatesBrowserModule
2731
],
2832
providers: [
29-
{
30-
// The server provides these in main.server
31-
provide: REQUEST,
32-
useFactory: (getRequest)
33+
{
34+
// The server provides these in main.server
35+
provide: REQUEST,
36+
useFactory: (getRequest)
3337
},
3438
{ provide: AppStorage, useClass: CookieStorage },
3539
{
@@ -38,4 +42,5 @@ export function getRequest(): any {
3842
}
3943
]
4044
})
41-
export class BrowserAppModule {}
45+
export class AppBrowserModule {
46+
}

src/app/app.module.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
import { AppRoutes } from './app.routing';
1+
// angular
2+
import { NgModule } from '@angular/core';
23
import { RouterModule } from '@angular/router';
3-
import { TransferHttpModule } from '../modules/transfer-http/transfer-http.module';
4-
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
4+
import { HttpClientModule } from '@angular/common/http';
55
import { BrowserModule } from '@angular/platform-browser';
6-
import { NgModule } from '@angular/core';
7-
import { AppComponent } from './app.component';
6+
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
7+
// libs
88
import { CookieService } from 'ngx-cookie-service';
9-
import { HttpClientModule } from '@angular/common/http';
10-
import { MetaModule, MetaSettings } from '@ngx-meta/core';
11-
import { MetaLoader } from '@ngx-meta/core';
12-
import { MetaStaticLoader } from '@ngx-meta/core';
13-
import { PageTitlePositioning } from '@ngx-meta/core';
9+
import { MetaLoader, MetaModule, MetaSettings, MetaStaticLoader, PageTitlePositioning, } from '@ngx-meta/core';
1410
import { PrebootModule } from 'preboot';
11+
// shared
12+
import { TransferHttpModule } from '../modules/transfer-http/transfer-http.module';
1513
import { SharedModule } from '@shared/shared.module';
14+
// components
15+
import { AppRoutes } from './app.routing';
16+
import { AppComponent } from './app.component';
1617

1718
export function metaFactory(): MetaLoader {
1819
const setting: MetaSettings = {
@@ -50,9 +51,10 @@ export function metaFactory(): MetaLoader {
5051
provide: MetaLoader,
5152
useFactory: metaFactory,
5253
deps: []
53-
})
54+
}),
5455
],
5556
providers: [CookieService],
5657
bootstrap: [AppComponent]
5758
})
58-
export class AppModule { }
59+
export class AppModule {
60+
}

src/app/app.server.module.ts

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,18 @@
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';
3+
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server';
4+
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
5+
// libs
6+
import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader';
87
import 'rxjs/add/operator/filter';
98
import 'rxjs/add/operator/first';
10-
import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader';
11-
import { ServerTransferStateModule } from '@angular/platform-server';
12-
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-
}
20-
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-
}
28-
29-
export function translateFactory() {
30-
return new TranslateUniversalLoader('./dist/assets/i18n', '.json');
31-
}
9+
// shared
10+
import { UniversalStorage } from '../forStorage/server.storage';
11+
import { AppStorage } from '../forStorage/universal.inject';
12+
import { TranslatesServerModule } from '@shared/translates/translates-server';
13+
// components
14+
import { AppComponent } from './app.component';
15+
import { AppModule } from './app.module';
3216

3317
@NgModule({
3418
imports: [
@@ -37,12 +21,7 @@ export function translateFactory() {
3721
ServerTransferStateModule,
3822
ServerModule,
3923
ModuleMapLoaderModule,
40-
TranslateModule.forRoot({
41-
loader: {
42-
provide: TranslateLoader,
43-
useFactory: translateFactory
44-
}
45-
}),
24+
TranslatesServerModule
4625
],
4726
bootstrap: [AppComponent],
4827
providers: [
@@ -51,4 +30,5 @@ export function translateFactory() {
5130
}
5231
],
5332
})
54-
export class AppServerModule { }
33+
export class AppServerModule {
34+
}

src/app/shared/shared.module.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { ModuleWithProviders, NgModule } from '@angular/core';
22

33
import { LayoutsModule } from './layouts/layouts.module';
4-
import { TranslatesModule } from './translates';
54

65
@NgModule({
76
exports: [
87
LayoutsModule,
9-
TranslatesModule
108
],
119
providers: []
1210
})

src/app/shared/translates/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
1-
export { TranslatesModule } from './translates.module';
21
export { TranslatesService } from './translates.service';
32
export { ITranslatesLanguage } from './translates.interface';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { TranslatesBrowserModule } from './translates-browser.module';
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { HttpClient } from '@angular/common/http';
2+
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
3+
4+
import { TranslateLoader } from '@ngx-translate/core';
5+
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
6+
import { Observable } from 'rxjs/Observable';
7+
8+
export class TranslatesBrowserLoaderService implements TranslateLoader {
9+
constructor(private prefix: string = 'i18n',
10+
private suffix: string = '.json',
11+
private transferState: TransferState,
12+
private http: HttpClient) {
13+
}
14+
15+
public getTranslation(lang: string): Observable<any> {
16+
const key: StateKey<number> = makeStateKey<number>(`transfer-translate-${lang}`);
17+
const data = this.transferState.get(key, null);
18+
if (data) {
19+
return Observable.create(observer => {
20+
observer.next(data);
21+
observer.complete();
22+
});
23+
} else {
24+
return new TranslateHttpLoader(this.http, this.prefix, this.suffix).getTranslation(lang);
25+
}
26+
}
27+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { NgModule } from '@angular/core';
2+
import { HttpClient } from '@angular/common/http';
3+
import { TransferState } from '@angular/platform-browser';
4+
5+
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
6+
7+
import { TranslatesService } from '@shared/translates/translates.service';
8+
9+
import { TranslatesBrowserLoaderService } from './translates-browser-loader.service';
10+
11+
export function translateStaticLoader(http: HttpClient, transferState: TransferState): TranslatesBrowserLoaderService {
12+
return new TranslatesBrowserLoaderService('/assets/i18n/', '.json', transferState, http);
13+
}
14+
15+
@NgModule({
16+
imports: [
17+
TranslateModule.forRoot({
18+
loader: {
19+
provide: TranslateLoader,
20+
useFactory: translateStaticLoader,
21+
deps: [HttpClient, TransferState]
22+
}
23+
}
24+
),
25+
],
26+
providers: [TranslatesService]
27+
})
28+
export class TranslatesBrowserModule {
29+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { TranslatesServerModule } from './translates-server.module';
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
2+
3+
import { TranslateLoader } from '@ngx-translate/core';
4+
import { Observable } from 'rxjs/Observable';
5+
6+
const fs = require('fs');
7+
8+
export class TranslatesServerLoaderService implements TranslateLoader {
9+
constructor(private prefix: string = 'i18n',
10+
private suffix: string = '.json',
11+
private transferState: TransferState) {
12+
}
13+
14+
public getTranslation(lang: string): Observable<any> {
15+
return Observable.create(observer => {
16+
const jsonData = JSON.parse(fs.readFileSync(`${this.prefix}/${lang}${this.suffix}`, 'utf8'));
17+
const key: StateKey<number> = makeStateKey<number>(`transfer-translate-${lang}`);
18+
this.transferState.set(key, jsonData);
19+
observer.next(jsonData);
20+
observer.complete();
21+
});
22+
}
23+
}

0 commit comments

Comments
 (0)