Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to translate mat-paginator in Angular 4?

Do you have any ideas how can I translate "Items per page" in Angular's mat-paginator tag? The mat-paginator is an element from Material Design.

like image 883
bigmeister Avatar asked Dec 01 '17 12:12

bigmeister


People also ask

How do I change my mat Paginator label?

The labels for the paginator can be customized by providing your own instance of MatPaginatorIntl . This will allow you to change the following: The label for the length of each page. The range text displayed to the user.

What is Paginator angular?

The paginator displays a dropdown of page sizes for the user to choose from. The options for this dropdown can be set via pageSizeOptions. The current pageSize will always appear in the dropdown, even if it is not included in pageSizeOptions.

How do you hide the mat Paginator range label?

A solution is only achievable via CSS with the :host ::ng-deep . mat-paginator-range-label{ display: none; } style.


2 Answers

You can use the MatPaginatorIntl for this. Will Howell 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.


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

like image 157
Roy Avatar answered Sep 25 '22 22:09

Roy


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 { } 
like image 42
Felix Avatar answered Sep 22 '22 22:09

Felix