If needed the localization formats can be extended with new ones. The custom
function must be defined in the module using NGT_TRANSPILE_EXTENDER
token:
// app.module.ts
import { NGT_TRANSPILE_EXTENDER } from 'ng-translation';
import { CustomTranspileExtender } from './custom-transpile-extender';
@NgModule({
providers: [ {
provide: NGT_TRANSPILE_EXTENDER,
useClass: CustomTranspileExtender
} ],
...
})
export class AppModule { }
The function has to implement the TranspileExtender
interface. The new formats
can defined in the transpile()
method:
// custom-transpile-extender.ts
@Injectable()
export class CustomTranspileExtender implements TranspileExtender {
transpile(
format: string,
data: FormatData
): string | undefined {
switch (format) {
case 'format-name':
return 'result string';
default:
return undefined;
}
}
}
The following example defines the Roman number format:
// roman-number-format.ts
import { Injectable } from '@angular/core';
import { FormatData, TranspileExtender } from 'ng-translation';
function integerToRoman(
num: number
): string {
const digits = String( +num ).split( '' );
const key = [
'', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',
'', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',
'', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'
];
let roman = '';
let i = 3;
while (i--) {
roman = (key[ +digits.pop() + (i * 10) ] || '') + roman;
}
return Array(+digits.join('') + 1).join('M') + roman;
}
@Injectable()
export class CustomTranspileExtender implements TranspileExtender {
transpile(
format: string,
data: FormatData
): string | undefined {
switch (format) {
case 'roman':
return integerToRoman( parseInt( data.value, 10 ) );
default:
return undefined;
}
}
}