Skip to content

Commit 0a16dae

Browse files
committed
feat:add MissingTranslationHandler
1 parent 7501bc9 commit 0a16dae

File tree

4 files changed

+71
-33
lines changed

4 files changed

+71
-33
lines changed

src/app/home/home.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
<h1>{{ "home.title" | translate }}</h1>
2-
<p>{{ "home.text" | translate }}</p>
2+
<p>{{ "home.text" | translate }}</p>
3+
<p>{{ "home.notranslatewarn" | translate }}</p>

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,36 @@ import { NgModule } from '@angular/core';
22
import { HttpClient } from '@angular/common/http';
33
import { TransferState } from '@angular/platform-browser';
44

5-
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
5+
import { TranslateLoader, TranslateModule, MissingTranslationHandler } from '@ngx-translate/core';
66

7-
import { TranslatesService } from '@shared/translates/translates.service';
7+
import {
8+
TranslatesService,
9+
CommonMissingTranslationHandler,
10+
} from '@shared/translates/translates.service';
811

912
import { TranslatesBrowserLoaderService } from './translates-browser-loader.service';
1013

11-
export function translateStaticLoader(http: HttpClient, transferState: TransferState): TranslatesBrowserLoaderService {
14+
export function translateStaticLoader(
15+
http: HttpClient,
16+
transferState: TransferState,
17+
): TranslatesBrowserLoaderService {
1218
return new TranslatesBrowserLoaderService('/assets/i18n/', '.json', transferState, http);
1319
}
1420

1521
@NgModule({
1622
imports: [
1723
TranslateModule.forRoot({
18-
loader: {
19-
provide: TranslateLoader,
20-
useFactory: translateStaticLoader,
21-
deps: [HttpClient, TransferState]
22-
}
23-
}
24-
),
24+
missingTranslationHandler: {
25+
provide: MissingTranslationHandler,
26+
useClass: CommonMissingTranslationHandler,
27+
},
28+
loader: {
29+
provide: TranslateLoader,
30+
useFactory: translateStaticLoader,
31+
deps: [HttpClient, TransferState],
32+
},
33+
}),
2534
],
26-
providers: [TranslatesService]
35+
providers: [TranslatesService],
2736
})
28-
export class TranslatesBrowserModule {
29-
}
37+
export class TranslatesBrowserModule {}
Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { NgModule } from '@angular/core';
22
import { TransferState } from '@angular/platform-browser';
33

4-
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
4+
import {
5+
TranslateLoader,
6+
TranslateModule,
7+
MissingTranslationHandler,
8+
} from '@ngx-translate/core';
59

6-
import { TranslatesService } from '@shared/translates/translates.service';
10+
import {
11+
TranslatesService,
12+
CommonMissingTranslationHandler,
13+
} from '@shared/translates/translates.service';
714

815
import { TranslatesServerLoaderService } from './translates-server-loader.service';
916

@@ -14,14 +21,17 @@ export function translateFactory(transferState: TransferState): TranslatesServer
1421
@NgModule({
1522
imports: [
1623
TranslateModule.forRoot({
24+
missingTranslationHandler: {
25+
provide: MissingTranslationHandler,
26+
useClass: CommonMissingTranslationHandler,
27+
},
1728
loader: {
1829
provide: TranslateLoader,
1930
useFactory: translateFactory,
20-
deps: [TransferState]
21-
}
31+
deps: [TransferState],
32+
},
2233
}),
2334
],
24-
providers: [TranslatesService]
35+
providers: [TranslatesService],
2536
})
26-
export class TranslatesServerModule {
27-
}
37+
export class TranslatesServerModule {}

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

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { Injectable, Inject, PLATFORM_ID } from '@angular/core';
22
import { DOCUMENT, isPlatformBrowser, isPlatformServer } from '@angular/common';
33
import { REQUEST } from '@nguniversal/express-engine/tokens';
4-
import { TranslateService as NGXTranslateService } from '@ngx-translate/core';
4+
import {
5+
TranslateService as NGXTranslateService,
6+
MissingTranslationHandler,
7+
MissingTranslationHandlerParams,
8+
} from '@ngx-translate/core';
59
import { MetaService } from '@ngx-meta/core';
610
import { Observable, of } from 'rxjs';
711

@@ -10,21 +14,22 @@ import { AppStorage } from '@shared/for-storage/universal.inject';
1014
import { ILang } from './translates.interface';
1115

1216
const LANG_LIST: ILang[] = [
13-
{ 'code': 'ru', 'name': 'Русский', 'culture': 'ru-RU' },
14-
{ 'code': 'en', 'name': 'English', 'culture': 'en-US' }
17+
{ code: 'ru', name: 'Русский', culture: 'ru-RU' },
18+
{ code: 'en', name: 'English', culture: 'en-US' },
1519
];
1620
const LANG_DEFAULT: ILang = LANG_LIST[0];
1721
const STORAGE_LANG_NAME: string = 'langCode';
1822

1923
@Injectable()
2024
export class TranslatesService {
21-
constructor(@Inject(PLATFORM_ID) private _platformId: Object,
22-
@Inject(DOCUMENT) private _document: any,
23-
@Inject(REQUEST) private _request: Request,
24-
@Inject(NGXTranslateService) private _translate: NGXTranslateService,
25-
@Inject(MetaService) private _meta: MetaService,
26-
@Inject(AppStorage) private _appStorage: Storage
27-
) { }
25+
constructor(
26+
@Inject(PLATFORM_ID) private _platformId: Object,
27+
@Inject(DOCUMENT) private _document: any,
28+
@Inject(REQUEST) private _request: Request,
29+
@Inject(NGXTranslateService) private _translate: NGXTranslateService,
30+
@Inject(MetaService) private _meta: MetaService,
31+
@Inject(AppStorage) private _appStorage: Storage,
32+
) {}
2833

2934
public initLanguage(): Promise<any> {
3035
return new Promise((resolve: Function) => {
@@ -46,8 +51,13 @@ export class TranslatesService {
4651
}
4752
if (isPlatformServer(this._platformId)) {
4853
try {
49-
const reqLangList: string[] = this._request.headers['accept-language'].split(';')[0].split(',');
50-
language = LANG_LIST.find((lang: ILang) => reqLangList.indexOf(lang.code) !== -1 || reqLangList.indexOf(lang.culture) !== -1);
54+
const reqLangList: string[] = this._request.headers['accept-language']
55+
.split(';')[0]
56+
.split(',');
57+
language = LANG_LIST.find(
58+
(lang: ILang) =>
59+
reqLangList.indexOf(lang.code) !== -1 || reqLangList.indexOf(lang.culture) !== -1,
60+
);
5161
} catch (err) {
5262
language = LANG_DEFAULT;
5363
}
@@ -85,3 +95,12 @@ export class TranslatesService {
8595
return this._translate.currentLang;
8696
}
8797
}
98+
99+
export class CommonMissingTranslationHandler implements MissingTranslationHandler {
100+
handle(params: MissingTranslationHandlerParams) {
101+
if (params.key.match(/\w+\.\w+/) && !params.translateService.translations['ru'][params.key]) {
102+
console.warn(`Нехватает перевода для "${params.key}"`);
103+
}
104+
return params.key;
105+
}
106+
}

0 commit comments

Comments
 (0)