ProcessWire - Multilanguage Website

Aus Wikizone
Wechseln zu: Navigation, Suche

Mehrsprachige Websites mit ProcessWire / Andere Default Sprache

Links

Einleitung

Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:

  • Wie übersetze ich Text in meinen Templates ? Siehe unten i18n
  • Wie übersetze ich Inhalte im Backend ? Dafür ist das Modul Language Support Fields zuständig
  • Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.
    • domain.de/en/meineSeite oder domain.de/myPage
    • Um Seitennamen zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul Language Support Page Names

Welche Module benötige ich

Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter

Modules > Core > Language
  • Languages Support - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will.
  • Languages Support - Fields Required to use multi-language fields. Basis für mehrsprachige Felder im Backend.
  • Languages Support - Page Names (LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn alle Seiten in allen Sprachen unterschiedliche Namen bekommen sollen.
  • Languages Support - Tabs Organizes multi-language fields into tabs for a cleaner easier to use interface.

Deutsch als Default Sprache

Wenn nur die Standardsprache verändert wird aber die Seite einsprachig bleibt brauchen wir nur das Modul Language Support

  • Enable languages support -> Core Module "Language Support" aktivieren. -> Languages stehen im Backend Setup zur Verfügung
  • Titel der Default Sprache anpassen (z.B. Deutsch (default) )
  • Language Pack in der default Sprache installieren -> Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den lang Tag im Header zu setzen, damit der Browser die Sprache richtig erkennt.

Mehrere Sprachen

Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module:

  • Language Support Fields für die Backend Übersetzungen und Language Support Page Names für die URLs.
  • FieldtypePageTitleLanguage benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.

... ToDo


  • Für weitere Sprachen entsprechend hinzufügen.

drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)

add a new language to it and drop in a language pack for any none english language or simply don't drop in a language pack to get the english version (but not as the default one!) As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.

So, yes, this is no solution if you once have set it up and need to switch the default language afterwards, but just want to note it.

Beispiel Default Sprache Deutsch

Todo Testen

  • Modul Language Support
  • Translation File unter Setup Sprachen hochladen
  • Übersetzungen von Hand hinzufügen

Templates für Multilanguage vorbereiten (i18n)

https://processwire.com/docs/multi-language-support/code-i18n/
https://processwire.com/blog/posts/functional-fields/

Functional fields

In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.

ProcessWire - Functional Fields
https://processwire.com/blog/posts/functional-fields/

Beispiele für die Ausgabe von

__text('your text');
__textarea('your text');
__richtext('<p>your text</p>'); 
__text('Subscribe Now', 'subscribe') // define a identifier for this text snippet...
__text('subscribe') // ..reuse it this way
$pages->get('/')->mytext->subscribe // reuse from another template
__text('Subscribe Now', 'subscribe', 'Submit button'); // Label for page editor
__text('Subscribe Now', 'subscribe', 'label=Submit button, notes=Test'); // or use a pw selector
__text('Subscribe Now', 'name=subscribe, label=Submit button, notes=Test'); // equivalent to upper



=== Standard Multilanguage nach i18n ===

 $out = $this->_("Live long and prosper");  // syntax within a class
 $out = __("Live long and prosper!"); // syntax outside of a class

Dann im Backend unter der Sprache "Find files to translate" und die Template Datei auswählen.

=== Variablen in i18n ===
 $out = sprintf(__("Created %d pages."), $count); 
 $out = sprintf(__('Your city is %1$s, and your zip code is %2$s.'), $city, $zipcode);

=== Plural in Multilanguage Files===
Hierzu gibt es die _n() Funktion
 $out = sprintf(_n("Created %d page.", "Created %d pages.", $count), $count);
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:
<pre>
$label = _x('Comment', 'noun'); // or $this->_x('Comment', 'noun') in a class
...
// some other place in the code
echo _x('Comment', 'column name');

Kommentare für den Übersetzer und User

$date = __('g:i:s a'); // Date string in PHP date() format
echo __("Welcome Guest"); // Headline for guest user // Keep it short (2-3 words)

Regeln

  • Eine Zeile ein Paar Anführungszeichen
  • Nur eine Übersetzungsfunktion pro Zeile

Language Switcher

// remember what language is set to
$savedLanguage = $user->language;

foreach($languages as $language) {

  // if user is already viewing the page in this language, skip it
  if($language->id == $savedLanguage->id) continue;

  // if this page isn't viewable (active) for the language, skip it
  if(!$page->viewable($language)) continue;

  // set the user's language, so that the $page->url and any other
  // fields we access from it will be reflective of the $language
  $user->language = $language;

  // output a link to this page in the other language
  echo "<li><a href='$page->url'>$language->title: $page->title</a></li>";
}
// restore the original language setting
$user->language = $savedLanguage;

Beispiele

Prantner

language-switcher.inc

<?php namespace ProcessWire;
$imgMarkup = "";
$out = "";
foreach($languages as $language) {
	if(!$page->viewable($language)) continue; // is page viewable in this language?
	$url = $page->localUrl($language);
	$hreflang = $homepage->getLanguageValue($language, 'name');
	$imgUrl = $config->urls->templates.'assets/flags/'.$language->name.'_sq.png';
	$imgMarkup = "<img src=\"$imgUrl\" title=\"$language->title\" alt=\"$language->title\" class=\"circle z-depth-1\">";
	if($language->id == $user->language->id) {
		$out .= "<span class=\"lang-button current\">";
	} else {
		$out .= "<span class=\"lang-button\">";
	}
	$out .= "<a hreflang=\"$hreflang\" href=\"$url\">$imgMarkup</a></span>";
}
$out = '<div id="nav-lang">'.$out.'</div>';
echo $out; 
?>

language-switcher-mobile.inc

<?php namespace ProcessWire;
?>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<?php
	foreach($languages as $language) {
		if(!$page->viewable($language)) continue; // is page viewable in this language?
		if($language->id == $user->language->id) {
			echo "<li class='current'>";
		} else {
			echo "<li>";
		}
		$url = $page->localUrl($language);
		$hreflang = $homepage->getLanguageValue($language, 'name');
		echo "<a hreflang='$hreflang' href='$url'>$language->title</a></li>";
	}
?>
</ul>