Lokalisierte Inhalte mit AEM Headless

AEM bietet ein Framework für die Übersetzungsintegration für Headless-Inhalte. Damit können Inhaltsfragmente und unterstützende Assets einfach übersetzt werden, damit sie in verschiedenen Gebietsschemata verwendet werden können. Hierbei handelt es sich um dasselbe Framework, mit dem andere AEM-Inhalte wie Seiten, Experience Fragments, Assets und Formulare übersetzt werden. Sobald Headless-Inhalte übersetzt und veröffentlicht wurden, sind sie für die Verwendung durch Headless-Anwendungen bereit.

Asset-Ordnerstruktur assets-folder-structure

Stellen Sie sicher, dass die lokalisierten Inhaltsfragmente in AEM der empfohlenen Lokalisierungsstruktur entsprechen.

Ordner für lokalisierte AEM-Assets

Die Ordner für die Gebietsschemata müssen gleichrangige Ordner sein, und der Ordnername muss anstelle des Titels ein gültiger ISO-639-1-Code sein, der das Gebietsschema des im Ordner enthaltenen Inhalts angibt.

Der Gebietsschema-Code ist auch der Wert, der zum Filtern der von der GraphQL-Abfrage zurückgegebenen Inhaltsfragmente verwendet wird.

Gebietsschema-Code
AEM-Pfad
Gebietsschema für Inhalte
de
/content/dam/…/de/…
Deutscher Inhalt
en
/content/dam/…/en/…
Englischer Inhalt
es
/content/dam/…/es/…
Spanischer Inhalt

GraphQL-persistierte Abfrage

AEM bietet einen _locale-GraphQL-Filter, der Inhalte automatisch nach Gebietsschema-Code filtert. Zum Beispiel kann das Abrufen aller englischen Abenteuer im WKND-Site-Projekt mit der neuen persistierten Abfrage wknd-shared/adventures-by-locale durchgeführt werden, die wie folgt definiert ist:

query($locale: String!) {
  adventureList(_locale: $locale) {
    items {
      _path
      title
    }
  }
}

Die Variable $locale, die im _locale-Filter verwendet wird, erfordert den Gebietsschema-Code (z. B. en, en_us oder de), wie in der Basis-Lokalisierungskonvention für AEMs Asset-Ordner angegeben.

React-Beispiel

Erstellen wir eine einfache React-App, die steuert, welche Adventure-Inhalte von AEM basierend auf einem Gebietsschema-Selektor mithilfe des _locale-Filters abgefragt werden.

Wenn Englisch im Gebietsschema-Selektor ausgewählt wird, werden englische Adventure-Inhaltsfragmente unter /content/dam/wknd/en zurückgegeben. Wenn Spanisch ausgewählt wird, werden spanische Inhaltsfragmente unter /content/dam/wknd/es zurückgegeben, und so weiter.

Lokalisierte React-Beispiel-App

Erstellen eines LocaleContext

Erstellen Sie zunächst einen React-Kontext, damit das Gebietsschema über die Komponenten der React-App hinweg verwendet werden kann.

// src/LocaleContext.js

import React from 'react'

const DEFAULT_LOCALE = 'en';

const LocaleContext = React.createContext({
    locale: DEFAULT_LOCALE,
    setLocale: () => {}
});

export default LocaleContext;

Erstellen der React-Komponente LocaleSwitcher

Als Nächstes erstellen Sie eine React-Komponente mit einem Gebietsschema-Umschalter, der den Wert von LocaleContext auf die Auswahl der Person festlegt.

Dieser Gebietsschemawert wird verwendet, um die GraphQL-Abfragen auszuführen und um sicherzustellen, dass nur Inhalte zurückgegeben werden, die dem ausgewählten Gebietsschema entsprechen.

// src/LocaleSwitcher.js

import { useContext } from "react";
import LocaleContext from "./LocaleContext";

export default function LocaleSwitcher() {
  const { locale, setLocale } = useContext(LocaleContext);

  return (
    <select value={locale}
            onChange={e => setLocale(e.target.value)}>
      <option value="de">Deutsch</option>
      <option value="en">English</option>
      <option value="es">Español</option>
    </select>
  );
}

Abfragen von Inhalt mit dem _locale-Filter adventures

Die Adventure-Komponente führt in AEM eine Abfrage für alle Adventures nach Gebietsschema aus und listet deren Titel auf. Dies wird erreicht, indem der im React-Kontext gespeicherte Gebietsschemawert mithilfe des _locale-Filters an die Abfrage übergeben wird.

Dieser Ansatz kann auf andere Abfragen in Ihrer Anwendung erweitert werden, um sicherzustellen, dass alle Abfragen nur Inhalte enthalten, die durch die Gebietsschema-Auswahl einer Person vorgegeben werden.

Die Abfrage in AEM wird im benutzerdefinierten React-Hook getAdventuresByLocale ausgeführt, der in der Dokumentation zu Abfragen von AEM GraphQL näher beschrieben wird.

// src/Adventures.js

import { useContext } from "react"
import { useAdventuresByLocale } from './api/persistedQueries'
import LocaleContext from './LocaleContext'

export default function Adventures() {
    const { locale } = useContext(LocaleContext);

    // Get data from AEM using GraphQL persisted query as defined above
    // The details of defining a React useEffect hook are explored in How to > AEM Headless SDK
    let { data, error } = useAdventuresByLocale(locale);

    return (
        <ul>
            {data?.adventureList?.items?.map((adventure, index) => {
                return <li key={index}>{adventure.title}</li>
            })}
        </ul>
    )
}

Definieren der App.js

Zum Schluss fügen Sie alles zusammen, indem Sie die React-App in LanguageContext.Provider einschließen und den Wert für das Gebietsschema festlegen. Dies ermöglicht den anderen React-Komponenten, LocaleSwitcher und Adventures, den Status der Gebietsschema-Auswahl zu teilen.

// src/App.js

import { useState, useContext } from "react";
import LocaleContext from "./LocaleContext";
import LocaleSwitcher from "./LocaleSwitcher";
import Adventures from "./Adventures";

export default function App() {
  const [locale, setLocale] = useState(useContext(LocaleContext).locale);

  return (
    <LocaleContext.Provider value={{locale, setLocale}}>
      <LocaleSwitcher />
      <Adventures />
    </LocaleContext.Provider>
  );
}
recommendation-more-help
e25b6834-e87f-4ff3-ba56-4cd16cdfdec4