Mehrsprachigkeit in MetaModels

MetaModels ist sehr gut auf mehrsprachige Inhalte ausgerichtet. MM stellt für die mehrsprachigen Inhalte eigene Attribute wie z. B. Übersetzter Text, Übersetzter Alias, Übersetzte Datei usw. zur Verfügung. Für Attribute deren Werte unabhängig von einer Sprache sind, wie z. B. Zahlenwerte Produkt-IDs usw. , gibt es diese Varianten nicht.

Die Mehrsprachigkeit in MetaModels ist so konzipiert, dass die mehrsprachigen Felder neben der Fallback-Sprache auch in den gewünschten Übersetzungen ausgefüllt werden. Sollte das bei einem Feld mal nicht der Fall sein, wird im Frontend automatisch der Fallback-Wert ausgegeben. Im Template kann nicht unterschieden werden, ob ein Wert aus der Übersetzung oder vom Fallback kommt.

Bevor man mit der Erstellung der Models startet gilt es gut zu überlegen, ob die Inhalte mehrsprachig abgelegt werden sollen. Die mehrsprachigen Inhalte werden in separaten Tabellen gespeichert und nicht in der eigenen mm_*, so dass ein späterer Wechsel zu einer Mehrsprachigkeit mit entsprechender Nachpflege verbunden ist.

Wenn man einsprachige Werte hat die man speichern möchte, aber die in verschiedenen Sprachen im Frontend ausgegeben werden sollen, ist eine Umstellung auf eine Mehrsprachigkeit unkritisch. Es werden lediglich die Attributsbezeichnungen entsprechend den Sprachen erweitert - siehe unten „Attribute“.

Models

Die Mehrsprachigkeit eines Models wird beim Erstellen festgelegt. Mit Aktivierung der Option „Übersetzung“ kann man eine Liste mit zu pflegenden Sprachen pflegen. Aktiviert man auch die Option „Support für Territory-Angabe in der Sprache“, werden zu den Einträgen der Hauptsprachen wie de, en, fr auch die territorialen Zusätze wie de_DE, de_AT, de_CH usw. in der Liste freigeschaltet.

Eine Sprache ist als Fallbacksprache festzulegen, für die dann auch immer alle Datensätze vorhanden sein müssen. Sollte die Fallbacksprache später gewechselt werden, muss das entsprechend in der DB geprüft und korrigiert werden.

Legt man mehrere Models an, die auch noch durch Relationen verbunden sind, ist es ratsam, bei allen Models dasselbe Sprachenschema und dieselbe Fallbacksprache zu definieren. Es ist auch sinnvoll nur die Sprachen anzulegen, die Contao über seine Startpunkte definiert hat.

Die mehrsprachigen MetaModels sind mit einer farbigen Länderfahne hervorgehoben img_locale.

Speicherung in Datenbank

Gespeichert werden die übersetzten Werte in separaten Tabellen tl_metamodel_translated* - je nach Attributstyp können das unterschiedliche Tabellen sein. Somit erscheinen die Werte nicht in der individuellen Tabelle des angelegten Models mm_*. Die Übersetzungstabellen haben eine Referenz zum Attribut att_id und zum Datensatz item_id sowie die Angabe der gespeicherten Sprache langcode.

Die Daten in der definierten Fallbacksprache müssen vorhanden sein, damit auch bei nicht vorhandener Übersetzung eine Ausgabe erfolgen kann. Seit MM 2.4 wird die Fallbacksprache in der Eingabemaske mit „img_fallback“ im Sprachenwechsler als auch in der Überschrift gekennzeichnet.

Wechselt man in der Eingabemaske von der Fallbacksprache zu einer Übersetzungssprache, werden in den Textfeldern die Eingaben der Fallbacksprache ausgegeben. Damit wird eine Übersetzung der Texte erleichtert. Mehr zum Thema Kennzeichnung im Abschnitt „Eingabemaske / Eingabe“.

Bemerkung

Wird ein Fallbacktext nicht übersetzt, so wird dieser auch nicht in der Übersetzungssprache eingespeichert. Dies ist insbesondere zu beachten, wenn ein Begriff in der Fallbacksprache als auch in der Übersetzungssprache gleich ist wie z. B. „Marketing“ in Englisch und Deutsch.
Wird eine Eingabe nach einer Übersetzung wieder auf den Fallback-Inhalt umgeschrieben, so wird der Eintrag für die Übersetzungssprache in der Datenbank wieder gelöscht.

Bemerkung

Ab MM 2.4 werden beim Kopieren eines Datensatzes alle Sprachen mit kopiert - siehe Issue

Bemerkung

Werden mehrsprachige Models oder Attribute gelöscht, werden nicht alle Inhalte mit gelöscht - hier Hinweise zum Prüfen und Löschen

Seit MM 2.4 gibt es den Parameter „Fallback-Modus deaktivieren“ - ist dieser aktiv, wird ein Wert für eine Sprache dennoch gespeichert, auch wenn dieser gleich dem Fallbackwert ist. Aktiviert ist diese Option z. B. beim Attribut Übersetzte Checkbox.

Attribute

Ist die Option „Übersetzung“ bei einem Model aktiviert, stehen beim Anlegen der Attribute auch die mehrsprachigen Varianten zur Verfügung. Je nach Installation kann das wie folgt sein:

*: die nicht-übersetzten Attribute Einzelauswahl und Mehrfachauswahl unterstützen per se die Mehrsprachigkeit bei Relationen zu MetaModel-Tabellen. Die beiden hier aufgeführten Attribute sind für Spezialfälle wie z. B. Relationen zu nicht-MM-Tabellen mit mehrsprachigen Inhalten. Diese Tabellen müssen aber eine Spalte mit dem Sprachschlüssel haben. Man kann dafür auch einsprachige MetaModel-Tabellen verwenden mit einem Attribut für den Sprachenschlüssel. Damit ist es möglich je Sprache nicht nur eine entsprechende Übersetzung zu liefern, sondern ganz andere Inhalte. Beispielsweise könnte eine Wanderung für englischsprachige Besucher „linksrum“ und für deutschsprachige Besucher „rechtsrum“ gehen.

Bei einem mehrsprachigen MetaModel stehen bei allen Attributsdefinition für die Felder „Name“ und „Beschreibung“ je Sprache ein Feld zur Verfügung - die Fallback-Sprache ist hervorgehoben dargestellt. Diese übersetzten Angaben werden in der Eingabemaske automatisch in der Sprache ausgegeben wenn die passende Backendsprache im Benutzerprofil ausgewählt ist.

Zudem kann im Template des Renderings über den Knoten attributes auf den übersetzten Wert „Name“ zugegriffen werden - es wird automatisch die Sprache der Contao Frontendausgabe oder der Fallbackwert ausgegeben. Im Template könnte eine Ausgabe wie folgt aussehen:

1 <p><strong><?= $arrItem['attributes']['name'] ?>:</strong> <?= $arrItem['text']['name'] ?></p>
2 <p><strong><?= $arrItem['attributes']['city'] ?>:</strong> <?= $arrItem['text']['city'] ?></p>
3 <p><strong><?= $arrItem['attributes']['description'] ?>:</strong> <?= $arrItem['text']['description'] ?></p>

Damit ist eine bequeme Handhabung der mehrsprachigen „Labels“ in einem Template möglich.

Eingabemaske / Eingabe

In der Eingabemaske im Backend haben die Widgets der mehrsprachigen Attribute zur Unterscheidung ein farbiges Flaggen-Icon img_locale. Die Umschaltung der Sprachen erfolgt direkt im Header der Eingabemaske. Die Fallbacksprache ist sowohl im Sprachenwechsler als auch in der Überschrift entsprechend gekennzeichnet.

Beim Neuanlegen eines Datensatzes wird immer erst die Fallbacksprache befüllt - wenn in der Maske noch eine andere Sprache als die Fallbacksprache eingestellt ist, wird mit dem Speichern auf die Fallbacksprache umgeschaltet.

Warnung

Das Speichern eines Datensatzes bzw. einer Eingabe erfolgt nicht automatisch bei der Umschaltung zu einer anderen Sprache - vor dem Umschalten müssen die Eingaben mit „Speichern“ gesichert werden!

Bemerkung

Die folgenden Anzeigen wurden in MM 2.4 eingebaut bzw. angepasst.

Nachdem die Felder in der Fallbacksprache befüllt und gespeichert sind, kann auf eine beliebige andere Sprache gewechselt werden. In den mehrsprachigen Feldern ist zunächst Inhalt aus der Fallbacksprache zu sehen. Zusätzlich wird bei dem Titel der Hinweis img_fallback eingeblendet, solange kein Inhalt gespeichert wurde, der sich von den Fallbackwerten unterscheidet. Damit soll der Status der Übersetzung leichter erkennbar werden.

Diese angezeigten Fallback-Inhalte werden aber beim Speichern nicht in der jeweiligen Übersetzungssprache in der DB gespeichert - siehe „Speicherung in Datenbank“.

Werden Inhalte in der Übersetzungssprache angelegt und gespeichert, wechselt der Hinweis bei den entsprechenden Eingabefeldern auf img_translated.

Je nach Status bei einem Eingabefeld sieht das dann z. B. so aus:

translation-hints

Erweiterungen zum Übersetzen:

Für kontinuierliche Übersetzungen bietet sich die Erweiterung XLIFF-Ex-Import für MetaModels an. Hiermit erfolgt der Austausch über das XLIFF-Format.

Die Dateien werden über die Erweiterung exportiert und nach der Übersetzung wieder importiert - für die Übersetzung können entsprechende Agenturen oder Tools eingebunden werden.

Für die Übersetzung im Backend steht die Erweiterung Translator-Bridge für MetaModels zur Verfügung, welche verschiedene Übersetzungsprovider wie DeepL einbindet. Eine Übersetzung kann je Eingabefeld erfolgen oder über einen Tastenkürzel für die aktive Eingabemaske der ausgewählten Sprache.

BE-Listenansicht

In der Listenansicht im Backend gibt es im Header auch einen Umschalter für die Sprache - werden in der Liste mehrsprachige Attribute ausgegeben, ist dann die Anzeige entsprechend der Sprache.

Filter

Die meisten Filterregeln suchen in der Sprache, die im Frontend gerade die aktive (Contao-)Sprache ist. Bei einigen Filterregeln wie „Einfache Abfrage“, „Einzelauswahl“, „Mehrfachauswahl“, „Textfilter“ gibt es die Option „Alle Sprachen durchsuchen“, sofern ein mehrsprachiges Attribut ausgewählt wurde. Diese Option kann man z. B. bei der Detailseite (s. u.) einsetzen.

Für das Attribut „Übersetzte Checkbox“ gibt es eine eigene Filterregel „Übersetzter Checkbox-Status“.

Bei der Filterregel „Levenshtein-gestützte Suche“ ist es bei der Attributseinstellung „Attribute zum Indexieren“ auch möglich, mehrsprachige Attribute auszuwählen.

Die Filterregel „Loupe-gestützte Volltextsuche“ unterstützt aktuell die mehrsprachigen Attribute Text und Langtext.

FE-Liste / Detailansicht

Im Frontend werden die Inhalte der Attribute analog zu den einsprachigen Attributen in den Templates ausgegeben. Ebenso werden die Attributsbezeichnungen übersetzt an das Template geliefert.

Bemerkung

Ist ein Inhalt nicht übersetzt, wird der Inhalt der Fallbacksprache ausgespielt - das gilt nicht nur für die Attribute mit Texteingaben, sondern auch für Attribute wie übersetzte Datei oder übersetzter Inhalt eines Artikels.

Das bedeutet, wenn z. B. bei der Übersetzungssprache keine eigene, sprachenspezifische Datei ausgewählt, werden alle Dateien aus der Fallbacksprache ausgegeben.

Aus welcher Sprache der Inhalt kommt, kann im raw-Knoten des Ausgabearrays im Knoten langcode abgefragt werden.

Hat man eine Detailseite bei der man üblicher Weise ein Datensatz per Alias anzeigen lassen möchte, soll man mit dem Sprachenwechsler zu der Detailseite in einer anderen Sprache wechseln können.

Erweiterungen wie „ChangeLanguage“ „sieht“ nur die in Contao angelegte Seite - z. B. https://my-domain.tld/en/dessert/details - ohne den Alias der Filterung.

Um der Erweiterung den Wert für die anderen Sprachen mit auf den Weg zu geben und entsprechend zu filtern, gibt es mehrere Möglichkeiten:

1. Filterregel „Einfache Abfrage“ die Option „Alle Sprachen durchsuchen“

Zunächst müssen alle Detailseiten der einzelnen Sprachen über die Seiteneigenschaften verknüpft werden - Button „Seite in Hauptsprache“. Zudem muss im Feld „Query-Parameter beibehalten“ der „URL-Parameter“ aus der Filterregel eingetragen werden (alias). Als URL-Parameter darf nicht „auto_item“ eingetragen werden, da ChangeLanguage damit nicht arbeiten kann.

Zudem wird die Filterregel „Einfache Abfrage“ erstellt oder angepasst. Der URL-Parameter darf nicht als auto_item eingetragen sein und die Option „Alle Sprachen durchsuchen“ muss aktiviert sein. Damit kann die Filterung mit allen Sprachvarianten erfolgen also mit

https://my-domain.tld/en/dessert/details/alias/marinated-strawberries als auch mit
https://my-domain.tld/de/dessert/details/alias/marinated-strawberries bzw.

https://my-domain.tld/en/dessert/details/alias/marinierte-erdbeeren als auch mit
https://my-domain.tld/de/dessert/details/alias/marinierte-erdbeeren.

2. Hook „changelanguageNavigation“

Möchte man die Option „Alle Sprachen durchsuchen“ nicht aktivieren oder mit auto_item als „URL-Parameter“ arbeiten, so kann man bei dem Sprachenwechsler „ChangeLanguage“ für jede Sprache der Filterparameter (z. B. Alias) über einen Hook passend austauschen - siehe Doku

Als Einstieg das Snippet: man muss prüfen, ob man sich auf der passenden Detailseite befindet z. B. ID 3, 15, 36 für die einzelnen Sprachenseiten. Mit dem aktuellen Wert des Filterparameters und der aktuellen Sprache kann der passende Wert für die jeweilige andere Sprache ermittelt werden. Diese Abfrage hängt vom jeweiligen Aufbau der MetaModels ab. Der Hook wird für jede Sprache in dem Sprachenwechsler einmal aufgerufen.

public function __invoke(ChangelanguageNavigationEvent $event)
{
    // ...

    // Right page?
    $listPageIds = [3, 15, 36];
    if (!\in_array($targetPageId = $event->getNavigationItem()->getTargetPage()->id, $listPageIds, true)) {
        return;
    }

    // Get alias value.
    $currentAliasValue = Input::get('auto_item');

    // Search for attribute value in target language.
    // $newAliasValue = ....

    // Set alias value for target language/page.
    $event->getUrlParameterBag()->setUrlAttribute('auto_item', $newAliasValue);
}

Mit dieser Variante werden auch die Angaben für hreflang in den Meta-Daten korrekt gesetzt - siehe SEO.

Frontend-Editing (FEE)

Mit MM 2.4 wird auch die Mehrsprachigkeit bei der Frontendbearbeitung unterstützt - mehr zu dem Thema - inkl. der Anzeige der Fallbacksprache und Übersetzungsstatus - siehe Frontend-Editing.