WordPress Multilanguage: Teil 2 – Polylang

Lang ist es her seit Teil 1, inzwischen habe ich mehrere Projekte mit WPML realisiert und nun versuche ich mich das erste Mal mit Polylang.

Hier möchte im Laufe des Projektes meine Erkenntnisse sammeln, vielleicht helfen Sie ja dem einen oder anderem (oder meinem zukünftigen Ich) schneller ans Ziel zu kommen.

Generelle Informationen zu Polylang

Die anwenderseitige Dokumentation von Polylang ist teilweise sehr ausführlich, die API ist jedoch relativ spärlich und weder vollständig noch ausführlich dokumentiert. Auf hookr bekommt man allerdings eine Auflistung aller Hooks und Filter: http://hookr.io/plugins/polylang/2.0.5/.

Die Installation und Konfiguration von Polylang ist eigentlich selbsterklärend und hat allen Anforderungen, die ich an das System hatte, entsprochen.

Um in Polylang Inhalte aus anderen Sprachen abzufragen, kann man den Query Parameter „lang“ auf einen (oder auch mehrere) gewünschten Language-Slug setzen, um eine Abfrage in allen Sprachen durchzuführen setzt man den Parameter auf einen leeren String.

Polylang kümmert sich bei Ajax Requests selbst um das Handling der Sprache, falls das Interface aber trotzdem nicht vollständig übersetzt ist könnte dieser Tipp eventuell weiterhelfen.

Übrigens: Die Backend Sprache des Benutzers kann man im Benutzerprofil einstellen.

Polylang Sprache aktiv im Code setzen

Ein kleiner Hack um die Polylang Sprache aktiv zu setzen wäre:

function setLanguage($language) {
	if(function_exists('PLL')) {
		PLL()->curlang = PLL()->model->get_language( $language);
	}
}

Ich denke zwar nicht, dass eine Änderung der Sprache auf diese Art Best-Practice ist, aber es hat mir ein Problem gelöst und vielleicht hilft es ja auch anderen.

ACF: Dropdown mit den aktiven Polylang Sprachen

Falls man eine Advanced Custom Fields Select Box mit den aktiven Sprachen benötigt, kann man das folgendermaßen lösen:

public function getLanguages() { 
	$output = array();
	if(function_exists('pll_languages_list')) {
		$translations = pll_languages_list(array("fields" => false));
		foreach($translations as $translation) {
			$output[$translation->slug] = $translation->name;
		}
	}
	return $output;
}
public function acfLanguageField($field) {
	$field['choices'] = array("" => "- " . __("Keine", $this->locale) . " -");
	foreach($this->getLanguages() as $slug =>$language) {
		$field['choices'][$slug] = $language;
	}
	return $field;
}
add_filter('acf/load_field/name=language', array($this,'acfLanguageField'));

 

Copy/Sync von Advanced Custom Fields / Post Meta Werten

Dafür stellt Polylang einen Filter pll_copy_post_metas zur Verfügung, der kontrolliert, welche Felder kopiert oder gesynct werden sollen. Dadurch können zu kopierende Felder ergänzt oder entfernt werden.

Definition des Filters:
add_filter('pll_copy_post_metas', 'polylang_sync_fields', 20,5);

Der Filter sieht dann zum Beispiel so aus:

function polylang_sync_fields($keys, $sync, $from, $to, $lang) {
	$multilanguage_copy_fields = array(
		"page" => array(
			"header_gallery"         => "header_gallery"
		),
		"my_event" => array(
			"multiple_days" => "multiple_days",
			"from_date"     => "from_date",
			"from_time"     => "from_time",
			"to_date"       => "to_date",
			"to_time"       => "to_time",
			"date"          => "date",
			"time"          => "time",
		)
	);
	$post_type = get_post_type($from);
	$keys      = array_merge($keys, $multilanguage_copy_fields(get_post_type($from)));
	return $keys;
}

In diesem Beispiel habe ich ein Array mit zu kopierenden Feldern abhängig vom Post Type definiert. Um den Fakt, dass diese Felder kopiert werden, auch für den Benutzer ersichtlich zu machen habe ich das Array als Klassenvariable gesetzt und noch folgenden ACF Hook ergänzt:

if(function_exists('PLL')) {
add_filter('acf/prepare_field',array($this,'acfPrepareField'));
}
public function acfPrepareField($field) {
$fields = $this->multilanguage_copy_fields(get_post_type());
if(isset($fields[$field['_name']])) {
$field['instructions'] .=' (Multilanguage)';
}
return $field;
}

Dadurch sieht auch der Admin sofort welche Felder zwischen den Sprachen kopiert werden und welche nicht.

Wie man die Advanced Custom Fields auch im Backend übersetzt, habe ich hier zusammengefasst.

Zusammenfassung

Die Umsetzung des Projektes mit Polylang war eigentlich relativ problemlos und insgesamt weniger aufwändig als mit WPML. Für Anfänger ist der Einstieg in Polylang sicher schwieriger als mit WPML, den Mehraufwand ist es aber meines Erachtens definitiv wert. Insgesamt empfinde ich derzeit die Konfiguration aber auch die Hooks/Filter Struktur als aufgeräumter und logischer. Die perfekte, problemlose Integration von ACF ist für mich sicherlich hauptausschlaggebend, das nächste WordPress Multilanguage Projekt wieder mit Polylang umzusetzen.

Das wars erstmal mit meinen Polylang Erkenntnissen, nun steht als nächstes die Übersetzung eines WooCommerce Webshops mit Polylang auf dem Plan.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.