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.
Stellen Sie sicher, dass die lokalisierten Inhaltsfragmente in AEM der empfohlenen Lokalisierungsstruktur entsprechen.
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 |
AEM bietet einen _locale
-GraphQL-Filter, der Inhalte automatisch nach Gebietsschema-Code filtert. Beispielsweise können Sie alle englischen Abenteuer im WKND-Site-Projekt kann mit einer neuen persistenten Abfrage durchgeführt werden wknd-shared/adventures-by-locale
definiert als:
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.
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.
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;
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>
);
}
_locale
-FilterDie 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>
)
}
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>
);
}