in case someone still wondering how to use angular 2 localization with webpack loader, i have modified the provider angular 2 cookbook provided;
First
create i18n.provider.ts
import { TRANSLATIONS, TRANSLATIONS_FORMAT, LOCALE_ID } from '@angular/core';
import { Observable } from "rxjs/Rx";
export function getTranslationProviders(): Promise<Object[]> {
// Get the locale id from the global
const locale = document['locale'] as string;
// return no providers if fail to get translation file for locale
const noProviders: Object[] = [];
// No locale or U.S. English: no translation providers
if (!locale || locale === 'en') {
return Promise.resolve(noProviders);
}
// Ex: 'locale/messages.fr.xlf`
const translationFile = `./src/app/localezation/messages.${locale}.xlf`;
var provider = getTranslationsWithSystemJs(translationFile)
.then((translations: string) => [
{ provide: TRANSLATIONS, useValue: translations },
{ provide: TRANSLATIONS_FORMAT, useValue: 'xlf' },
{ provide: LOCALE_ID, useValue: locale }
])
.catch(() => noProviders); // ignore if file not found
debugger;
return provider;
}
declare var System: any;
function getTranslationsWithSystemJs(file: string) {
// changes Start here
var text = "";
var fileRequest = new XMLHttpRequest();
fileRequest.open("GET", file, false);
fileRequest.onerror = function (err) {
console.log(err);
}
fileRequest.onreadystatechange = function () {
if (fileRequest.readyState === 4) {
if (fileRequest.status === 200 || fileRequest.status == 0) {
text = fileRequest.responseText;
}
}
}
fileRequest.send()
var observable = Observable.of(text);
var prom = observable.toPromise();
return prom;
}
notice the changes are :
- i used jxjs library to create observable/ promise
- i used XMLHttpRequest to get the localezation files
Second
in the main.ts files change the bootstrapping the same as mentioned in angular cookbook
getTranslationProviders().then(providers => {
const options = { providers };
platformBrowserDynamic().bootstrapModule(AppModule, options);
});