Maison > interface Web > js tutoriel > le corps du texte

Contenu de texte abstrait en angulaire

PHPz
Libérer: 2024-09-08 22:32:03
original
569 Les gens l'ont consulté

Si vous développez des sites Web, vous écrivez probablement beaucoup de texte dans les modèles de composants :

Abstract text content in Angular

Écrire un texte comme celui-ci n'est ni cassé ni bogué, mais plutôt fastidieux à maintenir pour des projets de longue durée. Pour améliorer cela, vous pouvez créer un fichier contenant tout le texte d'une fonctionnalité particulière et le réutiliser dans toute l'application en important les bonnes clés.

Ce fichier peut être :

  • Fichier JSON
  • Fichier TypeScript

Je vais décrire les avantages et les inconvénients des deux approches.

I) Fichier de traductions JSON

(1) Créer un fichier JSON

Dans le répertoire racine de votre projet, allez dans src/assets et créez un nouveau dossier (wording) et un fichier JSON (wording.json) :

? src 
|__ ? assets
|_____ ? wording
|_______ wording.json
Copier après la connexion

Et ajoutez vos traductions :

{
  "APP": {
    "TITLE": "Movies App",
    "DESCRIPTION": "The best site for movies"
  },
  "COMMON": {
    "BUTTON": "Peek In"
  },
  "MOVIES": {
    "BATMAN": {
      "TITLE": "Batman",
      "SERIES": {
        "THE_DARK_KNIGHT": {
          "TITLE": "The Dark Knight Series",
          "MOVIES": {
            "BATMAN_BEGINS": {
              "TITLE": "Batman Begins",
              "DESCRIPTION": "Bruce learns the art of fighting to confront injustice."
            },
            "THE_DARK_KNIGHT": {
              "TITLE": "The Dark Knight",
              "DESCRIPTION": "Lorem Ipsum"
            },
            "THE_DARK_KNIGHT_RISES": {
              "TITLE": "The Dark Knight Rises",
              "DESCRIPTION": "Lorem Ipsum"
            }
          }
        }
      }

    }
  }
}
Copier après la connexion

(2) Mettre à jour TSConfig

Si nécessaire, ajoutez solveJsonModule: true aux options du compilateur tsconfig.json pour autoriser l'importation de fichiers JSON dans les modules ECMAScript :

{
  "compilerOptions": {
    "resolveJsonModule": true, // Add this line to tsconfig.json
  }
}
Copier après la connexion

(3) Utilisez le fichier JSON

Importez le fichier directement dans le composant

// component file
import wording from '../../assets/wording/wording.json';

@Component({...}) 
export class HomeComponent implements OnInit {

  public pageText!: any;

  ngOnInit(): void {
    this.pageText = wording.MOVIES.BATMAN;
  }

}
Copier après la connexion

Ou créez un service qui importe tous les mots globalement :

// translations.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class TranslationsService {

  public wording!: any;

  constructor(private http: HttpClient) {
    this.setTranslations();
  }

  private setTranslations() {
    this.http.get('./assets/wording/wording.json').subscribe(data => {
      this.wording = data;
     });
  }

}

Copier après la connexion

Et puis injectez le service dans votre composant.

@Component({...}) 
export class HomeComponent implements OnInit {

  public pageText!: any;

  constructor(private readonly translationsService: TranslationsService) {}

  ngOnInit(): void {
    this.pageText = this.translationsService.wording.MOVIES.BATMAN;
  }

}
Copier après la connexion

Cependant, l'inconvénient de cette approche est que vous n'avez aucune intelligence pour le contenu du texte.

  <div class="movie-main-container">
    <span class="heading0">{{ pageText.TITLE }}</span>
    <!-- ..............No complaints here ? -->
    <div class="heading4">{{ pageText.HELLO_WORLD }}</div>
  </div>
Copier après la connexion

Pour résoudre ce problème, vous devrez créer un type personnalisé ou une interface autour de l'ensemble du fichier wording.json ou de l'objet particulier ("Batman") que vous utilisez dans le composant.

II) Fichier de traductions TypeScript

Une autre façon de procéder consiste à abandonner le fichier JSON et à créer un fichier Typescript à la place.

(1)

Créez un nouveau fichier wording.ts n'importe où dans src/app

// wording.ts
const WORDING = {
  APP: {
    TITLE: 'Movies App',
    DESCRIPTION: 'The best site for movies',
  },
  COMMON: {
    BUTTON: 'Peek In',
  },
  MOVIES: {
    BATMAN: {
      TITLE: 'Batman',
      SERIES: {
        THE_DARK_KNIGHT: {
          TITLE: 'The Dark Knight Series',
          MOVIES: {
            BATMAN_BEGINS: {
              TITLE: 'Batman Begins',
              DESCRIPTION:
                'Bruce learns the art of fighting to confront injustice.',
            },
            THE_DARK_KNIGHT: {
              TITLE: 'The Dark Knight',
              DESCRIPTION: 'Lorem Ipsum',
            },
            THE_DARK_KNIGHT_RISES: {
              TITLE: 'The Dark Knight Rises',
              DESCRIPTION: 'Lorem Ipsum',
            },
          },
        },
      },
    },
  },
};

export default WORDING;
Copier après la connexion

(2) Créez une classe qui lit à partir de ce fichier

Vous pouvez importer un nouveau fichier wordings.ts dans n'importe quel composant de votre choix. Cependant, j'aime créer une classe personnalisée (UseWording) qui lit ce fichier.

// use-wording.ts

import WORDING from './wording';

/**
 * Wrapper for translation wording
 */
export default class UseWording {

  get useWording() {
    return WORDING
  }
}
Copier après la connexion

(3) Inerisez la classe UseWording dans vos composants

import { Component } from '@angular/core';
import UseWording from '../../../shared/translations/use-wording';

@Component({...})
export class HomeComponent extends UseWording {
  readonly pageText = this.useWording.MOVIES.BATMAN
}
Copier après la connexion

Avec cela, vous pouvez immédiatement voir l'intellisense dans le modèle.

Abstract text content in Angular

De plus, vous pouvez créer davantage de propriétés de classe qui ciblent des clés spécifiques dans l'objet de formulation :

@Component({...})
export class HomeComponent extends UseWording {
  readonly pageText = this.useWording.MOVIES.BATMAN;
  readonly movies = this.useWording.MOVIES.BATMAN.SERIES.THE_DARK_KNIGHT.MOVIES;
  readonly common = this.useWording.COMMON;
}
Copier après la connexion
<div class="movie-main">
  <div class="movie-main-container">
    <span class="heading0">{{ pageText.TITLE }}</span>
    <div class="heading4">{{ pageText.SERIES.THE_DARK_KNIGHT.TITLE }}</div>
  </div>

  <div class="movie-main-cards">
    <div class="layout-centered">
      <div class="heading1">{{ movies.BATMAN_BEGINS.TITLE }}</div>
      <div class="heading4">
        {{ movies.BATMAN_BEGINS.DESCRIPTION }}
      </div>
      <button class="button-primary">{{ common.BUTTON }}</button>
    </div>
    <div class="layout-centered">
      <div class="heading1">{{ movies.THE_DARK_KNIGHT.TITLE }}</div>
      <div class="heading4">
        {{ movies.THE_DARK_KNIGHT.DESCRIPTION }}
      </div>
      <button class="button-primary">{{ common.BUTTON }}</button>
    </div>
    <div class="layout-centered">
      <div class="heading1">
        {{ movies.THE_DARK_KNIGHT_RISES.TITLE }}
        <div class="heading4">
          {{ movies.THE_DARK_KNIGHT_RISES.DESCRIPTION }}
        </div>
        <button class="button-primary">{{ common.BUTTON }}</button>
      </div>
    </div>
  </div>
</div>

Copier après la connexion

Notez que si votre composant de classe injecte des dépendances via le constructeur, le constructeur doit contenir un 'super' appel.

export class MyComponent extends UseWording {

  searchAccountsForm!: FormGroup;

  constructor(
    private fb: FormBuilder
  ) {
    super(); // <-- this is mandatory
  }
Copier après la connexion

Et tout comme avec JSON, si vous devez modifier un titre ou une description, vous le faites au même endroit (wording.ts) au lieu de modifier plusieurs fichiers/composants.

Conclusion

Cet article montre deux façons d'utiliser le libellé dans les composants angulaires. Les deux méthodes présentent des avantages et des inconvénients.

L'utilisation du fichier TypeScript accélère les choses et prend en charge l'intellisense, mais il peut ne pas être adapté pour travailler avec plusieurs langues.

L'utilisation du fichier JSON nécessite un travail supplémentaire, mais elle est bénéfique lorsque les traductions exactes sont utilisées dans diverses applications construites avec différentes technologies (qui prennent en charge le format JSON).

Si vous avez appris quelque chose de nouveau, n'oubliez pas d'appuyer sur le bouton Suivre. Suivez-moi également sur Twitter pour rester informé de mon prochain contenu.

Au revoir pour l'instant ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!