Multilang-Felder in ProcessWire exportieren und importieren, Teil 1

Webseiten in mehreren Sprachen zu erstellen, ist in ProcessWire problemlos möglich (siehe https://processwire.com/api/multi-language-support/). Man kann für jedes Feld definieren, ob es einsprachig oder mehrsprachig sein soll.

Um die Übersetzung einer größeren Webseite zu vereinfachen, wollen wir uns ansehen, wie man die mehrsprachigen Felder in eine CSV-Datei exportieren, darin übersetzen und dann wieder in ProcessWire importieren kann.

Teil 1: Der Export

Im ersten Teil kümmern wir uns um den Export. Dazu installieren wir am besten das Modul „Admin Custom Pages“, um auf einfache Weise Backend-Seiten anlegen zu können:

http://modules.processwire.com/modules/process-admin-custom-pages/

Nachdem wir dieses Modul installiert haben (Anleitung zum Installieren von Modulen siehe ProcessWire Doku), erstellen wir im Template-Verzeichnis eine neue Datei namens „export_lang.php“ und lassen sie vorerst leer.

Dann legen wir im Backend im Seitenbaum unter „Admin“ eine neue Seite an. Wir verwenden das Template „admin“ und geben der Seite einen passenden Titel und Namen (z.B. „Export Sprachen“). Im nächsten Schritt müssen wir unter „Process“ „ProcessAdminCustomPages“ und unter „Template“ unsere zuvor erstellte Datei „export_lang.php“ auswählen.

Weiters verwenden wir eine Klasse, welche den Umgang mit CSV-Dateien vereinfacht (Source-Code ist hier zu finden) und speichern diese im Verzeichnis site/templates/includes ab.

Damit wir für jede Sprache einen eindeutigen Bezeichner haben, haben wir dem Sprache-Template

Nun geben wir folgenden Code in unsere Template-Datei „export_lang.php“:

<?php
require_once(__DIR__ .'/includes/Csv.php');

// define all multilang field types
$fieldtypesMultilang = array(
                'FieldtypeTextareaLanguage', 
                'FieldtypeTextLanguage', 
                'FieldtypePageTitleLanguage');

$csv = new Csv();

$csv->setColumnNames(array('pageId', 'fieldId', 'pageName', 'fieldName'));
foreach ($wire->languages as $language) {
    $csv->addColumnName($language->name);
}

foreach($wire->fields->getAll() as $id => $fieldName) {

    $field = $wire->fields->get($id);
    if (in_array($field->type->name, $fieldtypesMultilang)) {
        $t = $field->getTemplates();

        $ps = $wire->pages->find('template=' . $t);
        $list = new \PageArray();
        foreach ($ps as $p) {
            if ($p->template != 'admin') {
                $csv->addVal($p->id);
                $csv->addVal($field->id);

                $csv->addVal($p->name);
                $csv->addVal($field->name);

                foreach ($wire->languages as $language) {                     
                    $p->of(false);                           
                    $csv->addVal($p->get($field->name)->getLanguageValue($language));
                }
                $csv->nextRow();
            }
        }
    }
}

$csv->download('i18n_fields');

Wählen wir nun im Backend den neu erstellten Menüpunkt „Export Sprachen“ aus, bekommen wir eine CSV-Datei mit den Feldern Page-Id, Feld-Id, zusätzlich noch Seitenname und Feldname und den im System angelegten Sprachen mit den jeweiligen Inhalten. Wir werden beim Import sehen, dass Seitenname und Feldname nur zur Information vorhanden sind. Um die Übersetzungen beim Import wieder richtig zuordnen zu können, genügt eigentlich PageId und FieldId.

Ein Hinweis: dieser Code funktioniert erst ab ProcessWire-Version 2.8 problemlos.

Wie das Einlesen einer übersetzten CSV-Datei funktioniert, sehen wir uns im 2. Teil an.