Documentation

 

Transpile extenders

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;
    }
  }
}