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.
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.
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.
A solution is only achievable via CSS with the :host ::ng-deep . mat-paginator-range-label{ display: none; } style.
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.
MatPaginatorIntl
from @angular/material
into your application.import { getDutchPaginatorIntl } from './app/dutch-paginator-intl';
in main.ts
fileprovider
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() } ]
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.
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 { }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With