Implement a Custom XLIFF Loader
Replace the default HTTP loader in Transloco with a custom loader that fetches and processes XLIFF translation files.
Standalone NgModule
Copy import {
TRANSLOCO_LOADER ,
Translation ,
TranslocoLoader ,
TRANSLOCO_CONFIG ,
translocoConfig ,
TranslocoModule ,
} from '@jsverse/transloco' ;
import { Injectable , isDevMode , NgModule } from '@angular/core' ;
import { from } from 'rxjs' ;
import { switchMap , map } from 'rxjs/operators' ;
import xliff from 'xliff/xliff2js' ;
// Utility function to convert XLIFF to the Transloco format
function toTranslationFormat (json : any ) : Translation {
const obj = json . resources .transloco;
return Object .keys (obj) .reduce ((acc , key) => {
acc[key] = obj[key].target;
return acc;
} , {} as Translation );
}
@ Injectable ({ providedIn : 'root' })
export class TranslocoXliffHttpLoader implements TranslocoLoader {
constructor ( private http : HttpClient ) {}
getTranslation (lang : string ) {
return this .http
.get < Translation >( `/assets/i18n/ ${ lang } .xlf` , { responseType : 'text' })
.pipe (
switchMap ((translation) => from ( xliff (translation))) ,
map (toTranslationFormat)
);
}
}
bootstrapApplication (AppComponent , {
providers : [
provideTransloco ({
... ,
loader : TranslocoXliffHttpLoader
}) ,
] ,
});
Copy import { HttpClient } from '@angular/common/http' ;
import {
TRANSLOCO_LOADER ,
Translation ,
TranslocoLoader ,
TRANSLOCO_CONFIG ,
translocoConfig ,
TranslocoModule ,
} from '@jsverse/transloco' ;
import { Injectable , isDevMode , NgModule } from '@angular/core' ;
import { from } from 'rxjs' ;
import { switchMap , map } from 'rxjs/operators' ;
import xliff from 'xliff/xliff2js' ;
// Utility function to convert XLIFF to the Transloco format
function toTranslationFormat (json : any ) : Translation {
const obj = json . resources .transloco;
return Object .keys (obj) .reduce ((acc , key) => {
acc[key] = obj[key].target;
return acc;
} , {} as Translation );
}
@ Injectable ({ providedIn : 'root' })
export class TranslocoXliffHttpLoader implements TranslocoLoader {
constructor ( private http : HttpClient ) {}
getTranslation (lang : string ) {
return this .http
.get < Translation >( `/assets/i18n/ ${ lang } .xlf` , { responseType : 'text' })
.pipe (
switchMap ((translation) => from ( xliff (translation))) ,
map (toTranslationFormat)
);
}
}
@ NgModule ({
exports : [TranslocoModule] ,
providers : [
provideTransloco ({
... ,
loader : TranslocoXliffHttpLoader
}) ,
] ,
})
export class TranslocoRootModule {}
Sample XLIFF Translation File (v1.2)
Create your XLIFF translation files in the assets/i18n
folder. Here's an example of a v1.2 XLIFF file:
Copy <? xml version = "1.0" encoding = "UTF-8" ?>
< xliff version = "1.2" xmlns = "urn:oasis:names:tc:xliff:document:1.2" >
< file source-language = "en" datatype = "plaintext" original = "transloco" >
< body >
< trans-unit id = "title" >
< source >Hello Transloco!</ source >
< target >Bonjour Transloco!</ target >
</ trans-unit >
</ body >
</ file >
</ xliff >