How to translate mat-paginator in Angular 4? How to translate mat-paginator in Angular 4? angular angular

How to translate mat-paginator in Angular 4?


You can use the MatPaginatorIntl for this. Will Showell made an example that no longer works, so here is an updated version (with Dutch) and step-by-step guidance.

  1. Import the MatPaginatorIntl from @angular/material into your application.
  2. Create a new paginator file for your locale (in this example I use Dutch) and import that: import { getDutchPaginatorIntl } from './app/dutch-paginator-intl'; in main.ts file
  3. Set a provider for the Paginator inside of the main.ts file, so it takes the translations of your local file (instead of English as default language):
providers: [   { provide: MatPaginatorIntl, useValue: getDutchPaginatorIntl() }]
  1. Inside your paginator-intl file, set the labels for the strings that can be translated and export these. Most important part of that file (see the example for more info):
paginatorIntl.itemsPerPageLabel = 'Items per pagina:';paginatorIntl.firstPageLabel = 'Eerste pagina';paginatorIntl.previousPageLabel = 'Vorige pagina';paginatorIntl.nextPageLabel = 'Volgende pagina';paginatorIntl.lastPageLabel = 'Laatste pagina';paginatorIntl.getRangeLabel = dutchRangeLabel;

Example on StackBlitz with the paginator translations file as starting point.


June 2018 - Update to Angular 6.x
This updated Example on StackBlitz is upgraded to Angular 6.x to accommodate the latest version of the framework. Only packages have changed, nothing inside the paginator has changed.


June 2019 - Update to Angular 8.x
This updated Example on StackBlitz is upgraded to Angular 8.x to accommodate the latest version of the framework. Only packages have changed, nothing inside the paginator has changed.


February 2020 - Update to Angular 9.x
This updated Example on StackBlitz is upgraded to Angular 9.x to accommodate the latest version of the framework. Package versions have changed. Major change is the way to import from Angular Material. You cannot import from Material root anymore. You need to specify the import from the module (material/paginator) itself:

import { MatPaginatorModule, MatPaginatorIntl } from '@angular/material/paginator';

June 2020 - Update to Angular 10.x
This updated Example on StackBlitz is upgraded to Angular 10.x to accommodate the latest version of the framework. Only packages have changed, nothing inside the paginator has changed.


December 2020 - Update to Angular 11.x
This updated Example on StackBlitz is upgraded to Angular 11.x to accommodate the latest version of the framework. Only packages have changed, nothing inside the paginator has changed.


May 2021 - Update to Angular 12.x
This updated Example on StackBlitz is upgraded to Angular 12.x to accommodate the latest version of the framework. Only packages have changed, nothing inside the paginator has changed.


Modified solution (with Angular 6) based on accepted answer with @ngx-translate:

@NgModule({  imports: [...],  providers: [    {      provide: MatPaginatorIntl, deps: [TranslateService],      useFactory: (translateService: TranslateService) => new PaginatorI18n(translateService).getPaginatorIntl()    }  ]})export class CoreModule {}

And the PaginatorI18n:

import { MatPaginatorIntl } from '@angular/material';import { TranslateService } from '@ngx-translate/core';export class PaginatorI18n {    constructor(private readonly translate: TranslateService) {}    getPaginatorIntl(): MatPaginatorIntl {        const paginatorIntl = new MatPaginatorIntl();        paginatorIntl.itemsPerPageLabel = this.translate.instant('ITEMS_PER_PAGE_LABEL');        paginatorIntl.nextPageLabel = this.translate.instant('NEXT_PAGE_LABEL');        paginatorIntl.previousPageLabel = this.translate.instant('PREVIOUS_PAGE_LABEL');        paginatorIntl.firstPageLabel = this.translate.instant('FIRST_PAGE_LABEL');        paginatorIntl.lastPageLabel = this.translate.instant('LAST_PAGE_LABEL');        paginatorIntl.getRangeLabel = this.getRangeLabel.bind(this);        return paginatorIntl;    }    private getRangeLabel(page: number, pageSize: number, length: number): string {        if (length === 0 || pageSize === 0) {            return this.translate.instant('RANGE_PAGE_LABEL_1', { length });        }        length = Math.max(length, 0);        const startIndex = page * pageSize;        // If the start index exceeds the list length, do not try and fix the end index to the end.        const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;        return this.translate.instant('RANGE_PAGE_LABEL_2', { startIndex: startIndex + 1, endIndex, length });    }}

and cz.json

{    "ITEMS_PER_PAGE_LABEL": "Počet řádků:",    "NEXT_PAGE_LABEL": "Další stránka",    "PREVIOUS_PAGE_LABEL": "Předchozí stránka",    "FIRST_PAGE_LABEL": "První stránka",    "LAST_PAGE_LABEL": "Poslední stránka",    "RANGE_PAGE_LABEL_1": "0 z {{length}}",    "RANGE_PAGE_LABEL_2": "{{startIndex}} - {{endIndex}} z {{length}}"}  

Configure ngx-translate in app.module.ts:

import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';const httpLoaderFactory = (http: HttpClient) => new TranslateHttpLoader(http, './assets/i18n/', '.json');@NgModule({  imports: [    TranslateModule.forRoot({      loader: { provide: TranslateLoader, useFactory: httpLoaderFactory, deps: [HttpClient] }    })  ],  providers: [{ provide: LOCALE_ID, useValue: 'cs' }],  bootstrap: [AppComponent]})export class AppModule { }


For a quick and dirty solution use this.paginator._intl property.

In my ...component.ts I have:

@ViewChild(MatPaginator) paginator: MatPaginator;ngOnInit() {  ...  this.paginator._intl.itemsPerPageLabel = 'My translation for items per page.';  ...}