因此,如果使用JIT,可以使用webpacks loader来热交换语言文件:
主要技术指标
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import { getTranslationProviders } from './app/providers/i18n.provider';
import { LocaleService } from './app/services/locale.service';
if ( environment.production ) {
enableProdMode();
}
const locale = new LocaleService();
locale.getLocale().then( ( localeValue ) => {
getTranslationProviders( localeValue ).then( providers => {
platformBrowserDynamic().bootstrapModule( AppModule, { providers } )
.catch( err => console.log( err ) );
} );
} );
i18n.提供商
import { TRANSLATIONS, TRANSLATIONS_FORMAT } from '@angular/core';
declare const require;
export function getTranslationProviders( locale: string ): Promise<any[]> {
const localeValue = locale || document[ 'locale' ] as string;
const noProviders: Object[] = [];
if ( !localeValue || localeValue === 'au' ) {
return Promise.resolve( noProviders );
}
try {
const translations = require( `raw-loader!../../locale/messages.${ localeValue }.xlf` );
return Promise.resolve( [
{ provide: TRANSLATIONS, useValue: translations },
{ provide: TRANSLATIONS_FORMAT, useValue: 'xlf' }
] );
} catch ( error ) {
console.error( error );
return Promise.resolve( noProviders );
}
}
以及
本地服务
import { WindowRef } from 'app/services/windowRef.service';
import { environment } from 'environments/environment';
@Injectable()
export class LocaleService {
_locale: string;
set locale( val: string ) {
this._locale = val;
}
get locale() {
return this._locale;
}
constructor() {
this.setLocale();
}
setLocale() {
const winRef = new WindowRef();
this.locale = ( environment.countryLookup[ document.location.hostname ] || 'au' ).toLowerCase();
const match = document.location.search.match( /au|nz/ );
if ( match ) {
this.locale = match.shift();
}
winRef.nativeWindow.document.locale = this.locale;
}
getLocale(): Promise<string> {
return Promise.resolve( this.locale );
}
}