67 votes

Comment utiliser MatPaginatorIntl ?

J'utilise MatPaginator et j'essaie de comprendre comment traduire ces étiquettes (la documentation n'est pas assez claire à ce sujet).

J'ai trouvé cet article montrant comment faire et j'ai suivi les étapes :

1 - J'ai créé un fichier appelé custom-paginator.ts et y mettre ce qui suit :

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

export class CustomPaginator extends MatPaginatorIntl {
  constructor() {
    super();
    this.nextPageLabel = ' My new label for next page';
    this.previousPageLabel = ' My new label for previous page';
    this.itemsPerPageLabel = 'Task per screen';
  }
}

2 - En app.module.ts J'ai mis :

@NgModule({
  // ...
  providers: [
    {
      provide: MatPaginatorIntl,
      useClass: CustomPaginator
    }
  ]
})
export class AppModule

Cependant, cela ne change rien. Qu'est-ce qui me manque ?

0 votes

Vous devriez supprimer l'initialisation des étiquettes du constructeur et cela devrait fonctionner.

105voto

Vinko Vorih Points 1065

Vous pouvez procéder comme suit : Je vous fournis des étiquettes croates :

customClass.ts

import {MatPaginatorIntl} from '@angular/material';
export class MatPaginatorIntlCro extends MatPaginatorIntl {
  itemsPerPageLabel = 'Stavki po stranici';
  nextPageLabel     = 'Slijedeća stranica';
  previousPageLabel = 'Prethodna stranica';

  getRangeLabel = function (page, pageSize, length) {
    if (length === 0 || pageSize === 0) {
      return '0 od ' + 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 startIndex + 1 + ' - ' + endIndex + ' od ' + length;
  };

}

et AppModule.ts :

providers: [{ provide: MatPaginatorIntl, useClass: MatPaginatorIntlCro}],

Il fonctionne très bien.

Vous devez également importer dans votre appModule.ts les deux MatPaginatorIntl et MatPaginatorIntlCro.

0 votes

Depuis angular 9, vous pouvez mettre en œuvre la solution ci-dessus en utilisant $localize, de sorte que toutes les localisations réelles seront effectuées dans les fichiers messages.xlf. Par exemple : itemsPerPageLabel = $localize`Items per page`

1 votes

Je pense que cela peut être simplement " const endIndex = Math.min(startIndex + pageSize, length) " ?

51voto

Ze Big Duck Points 401

Basé sur le code de Vinko Vorih, j'ai fait un paginateur fonctionnant avec ngx-translate, voici le code :

import { Injectable } from '@angular/core';
import { MatPaginatorIntl } from '@angular/material';
import { TranslateService } from "@ngx-translate/core";

export class PaginatorIntlService extends MatPaginatorIntl {
  translate: TranslateService;
  itemsPerPageLabel = 'Items per page';
  nextPageLabel     = 'Next page';
  previousPageLabel = 'Previous page';
  getRangeLabel = function (page, pageSize, length) {
    const of = this.translate ? this.translate.instant('paginator.of') : 'of';
    if (length === 0 || pageSize === 0) {
      return '0 ' + of + ' ' + 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 startIndex + 1 + ' - ' + endIndex + ' ' + of + ' ' + length;
  };

  injectTranslateService(translate: TranslateService) {
    this.translate = translate;

    this.translate.onLangChange.subscribe(() => {
      this.translateLabels();
    });

    this.translateLabels();
  }

  translateLabels() {
    this.itemsPerPageLabel = this.translate.instant('paginator.items_per_page');
    this.nextPageLabel = this.translate.instant('paginator.next_page');
    this.previousPageLabel = this.translate.instant('paginator.previous_page');
  }

}

Et ensuite dans votre entrée de fournisseurs de modules :

{
  provide: MatPaginatorIntl,
  useFactory: (translate) => {
    const service = new PaginatorIntlService();
    service.injectTranslateService(translate);
    return service;
  },
  deps: [TranslateService]
}

De cette façon, vous pouvez stocker les traductions dans votre fichier i18n habituel et si votre application web est capable de changer dynamiquement de locale, le paginateur sera traduit à la demande.

0 votes

J'essaie de l'utiliser et tout fonctionne comme prévu, sauf le chargement initial. Lorsque le site est rendu, aucune langue n'est encore chargée et je dois déclencher un nouveau rendu pour que la traduction soit activée. Avez-vous une solution ?

0 votes

Ça marche. Je l'ai utilisé avec storageLayerService pour prendre le lang du stockage local ;)

1 votes

J'ai fait un copier-coller de ce document à des fins de test, et il ne semble pas fonctionner comme prévu. Lorsque je change de langue, le paginateur n'est pas mis à jour. Je dois passer la souris sur l'un des boutons pour déclencher la mise à jour.

22voto

PlusMinus Points 61

Si vous voulez qu'un changement de langue dynamique avec ngx-translate fonctionne pour vous, voici la solution, elle fonctionne pour moi.

mat-paginator-i18n.service.ts

import { MatPaginatorIntl } from '@angular/material';
import { TranslateService } from '@ngx-translate/core';
import { Injectable } from '@angular/core';

const ITEMS_PER_PAGE = 'Items per page:';
const NEXT_PAGE = 'Next page';
const PREV_PAGE = 'Previous page';
const FIRST_PAGE = 'First page';
const LAST_PAGE = 'Last page';

@Injectable()
export class MatPaginatorI18nService extends MatPaginatorIntl {
public constructor(private translate: TranslateService) {
  super();

  this.translate.onLangChange.subscribe((e: Event) => {
    this.getAndInitTranslations();
  });

  this.getAndInitTranslations();
}

public getRangeLabel = (page: number, pageSize: number, length: number): string => {
  if (length === 0 || pageSize === 0) {
    return `0 / ${length}`;
  }

  length = Math.max(length, 0);

  const startIndex: number = page * pageSize;
  const endIndex: number = startIndex < length
    ? Math.min(startIndex + pageSize, length)
    : startIndex + pageSize;

  return `${startIndex + 1} - ${endIndex} / ${length}`;
};

public getAndInitTranslations(): void {
  this.translate.get([
    ITEMS_PER_PAGE,
    NEXT_PAGE,
    PREV_PAGE,
    FIRST_PAGE,
    LAST_PAGE,
  ])
    .subscribe((translation: any) => {
      this.itemsPerPageLabel = translation[ITEMS_PER_PAGE];
      this.nextPageLabel = translation[NEXT_PAGE];
      this.previousPageLabel = translation[PREV_PAGE];
      this.firstPageLabel = translation[FIRST_PAGE];
      this.lastPageLabel = translation[LAST_PAGE];

      this.changes.next();
    });
}
}

Dans votre module AppModule

@NgModule({
  // ...
  providers: [
    {
      provide: MatPaginatorIntl,
      useClass: MatPaginatorI18nService,
    },
  ],
})
export class AppModule {
// ...

en.json, etc.

{
  "Items per page:": "Items per page:",
  "Next page": "Next page",
  "Previous page": "Previous page",
  "First page": "First page",
  "Last page": "Last page",
}

0 votes

Je sais que c'est une vieille question et que vous n'avez peut-être pas la réponse, mais mon HTML ne semble pas se mettre à jour. J'ai débogué et les valeurs des propriétés de l'élément MatPaginatorI18nService changent correctement lorsque les langues changent, mais la vue n'est pas mise à jour. Une solution à ce problème ?

0 votes

@RubenSzekér Bonjour ! Si vous faites tout comme l'exemple ci-dessus, je n'ai aucune idée. Peut-être quelque chose avec la détection des changements dans votre composant. Si vous pouviez reproduire cela sur stackblitz, je jetterais un coup d'œil.

13voto

Alan Points 417

Dans le fichier : matPaginatorIntlCroClass.ts

import {MatPaginatorIntl} from '@angular/material';
export class MatPaginatorIntlCro extends MatPaginatorIntl {
  itemsPerPageLabel = 'Items par page';
  nextPageLabel     = 'Page Prochaine';
  previousPageLabel = 'Page Précedente';
}

dans le fichier : AppModule.ts :

import { MatPaginatorModule, MatPaginatorIntl} from '@angular/material';
import { MatPaginatorIntlCro } from './matPaginatorIntlCroClass'

@NgModule({
  imports: [],
  providers: [{ provide: MatPaginatorIntl, useClass: MatPaginatorIntlCro}],
  ..
})

Source : https://material.angular.io/components/paginator/api

6voto

J'ai fait quelques modifications pour corriger l'index de fin lorsque l'index de début dépasse la longueur de la liste. J'ai aussi ajouté la traduction pour la première et la dernière page. C'est pour le composant de pagination @angular/material 5.2.4.

import { Injectable } from '@angular/core';
import { MatPaginatorIntl } from '@angular/material';
import { TranslateService } from '@ngx-translate/core';

@Injectable()
export class MatPaginationIntlService extends MatPaginatorIntl {
  translate: TranslateService;
  firstPageLabel = 'First page';
  itemsPerPageLabel = 'Items per page';
  lastPageLabel = 'Last page';
  nextPageLabel = 'Next page';
  previousPageLabel = 'Previous page';

  getRangeLabel = (page: number, pageSize: number, length: number): string => {
    const of = this.translate ? this.translate.instant('mat-paginator-intl.of') : 'of';
    if (length === 0 || pageSize === 0) {
      return '0 ' + of + ' ' + length;
    }
    length = Math.max(length, 0);
    const startIndex = ((page * pageSize) > length) ?
      (Math.ceil(length / pageSize) - 1) * pageSize:
      page * pageSize;

    const endIndex = Math.min(startIndex + pageSize, length);
    return startIndex + 1 + ' - ' + endIndex + ' ' + of + ' ' + length;
  };

  injectTranslateService(translate: TranslateService) {
    this.translate = translate;

    this.translate.onLangChange.subscribe(() => {
      this.translateLabels();
    });

    this.translateLabels();
  }

  translateLabels() {
    this.firstPageLabel = this.translate.instant('mat-paginator-intl.first_page');
    this.itemsPerPageLabel = this.translate.instant('mat-paginator-intl.items_per_page');
    this.lastPageLabel = this.translate.instant('mat-paginator-intl.last_page');
    this.nextPageLabel = this.translate.instant('mat-paginator-intl.next_page');
    this.previousPageLabel = this.translate.instant('mat-paginator-intl.previous_page');
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X