Kirby-Sprachumschalter

Veröffentlicht von am

Ich versuche, möglichst alle Inhalte meiner Website mehrsprachig anzubieten. Dabei helfen mir die Übersetzungs- und Internationalisierungsschnittstellen meines Content Management Systems Kirby. Sie machen es einfach, mehrsprachige Inhalte zu erstellen.

Kürzlich stieß ich jedoch auf ein kleines Problem, dessen Lösung mehr Zeit in Anspruch nahm, als ich erwartet hatte.

Es geht um die Einbindung des Sprachumschalters, der sich am Ende jeder Seite befindet und einen Link zur aktuellen Seite in einer anderen Sprachversion enthält:

This page is also available in English.

Dazu habe ich zunächst für die Sprachen, die ich unterstützen möchte (in meinem Fall Deutsch und Englisch) einen neuen Eintrag in der entsprechenden Übersetzungsdatei unter site/language/$lang_code.php eingefügt:

<?php

return [
    'code' => 'de',
    'default' => true,
    'direction' => 'ltr',
    'locale' => 'de_DE.utf-8',
    'name' => 'Deutsch',
    'translations' => [
        'footer_translated' => 'Diese Seite gibts auch auf <a href="{language_url}">{language_name}</a>',
    ]
];
<?php
return [
    'code' => 'en',
    'default' => false,
    'direction' => 'ltr',
    'locale' => 'en_US.utf-8',
    'name' => 'English',
    'translations' => [
        'footer_translated' => 'This page is also available in <a href="{language_url}">{language_name}</a>.',
    ]
];

Als nächstes habe ich das folgende Snippet in der Datei site/snippets/language_switch.php erstellt:

<?php

use Kirby\Toolkit\I18n;

$current_language = $kirby->language();

foreach ($kirby->languages() as $language) {
    if ($language !== $current_language) {
        $url_for_target_language = $page->url($language->code());

        if (!empty($_GET)) {
            $query_string = http_build_query($_GET);

            if (strlen($query_string) > 0) {
                $url_for_target_language = $url_for_target_language . '?' . $query_string;
            }
        }

?>
        <p lang="<?= $language->code() ?>">
            <?= I18n::template(
                'footer_translated',
                null,
                [
                    'language_url' => $url_for_target_language,
                    'language_name' => $language->name()
                ],
                $language->code()
            ) ?>
        </p>
<?php
    }
}
?>

Hier werden einige interessante Kirby-Funktionen miteinander verknüpft:

  • In einer Schleife werden zunächst alle Sprachen durchlaufen, die in Kirby angelegt wurden, wobei die aktuelle Sprache übersprungen wird.
  • Als nächstes wird die URL der aktuellen Seite in einer anderen Sprache gesucht. Diese erhalten wir, indem wir die Hilfsfunktion $page->url() mit einem Parameter aufrufen und ihr die Zielsprache übergeben: $page->url($language->code()).
  • Bei Bedarf werden auch alle $_GET-Anfrageparameter an die neue URL durchgereicht.
  • Wir verwenden das lang-Attribut, um dem Browser mitzuteilen, dass der Text in einer anderen Sprache als der Rest des Dokuments geschrieben ist. Dabei hilft uns die Hilfsfunktion $language->code(),
  • Schließlich verwenden wir die Funktion I18n::template(), um den übersetzten Text in der Zielsprache auszugeben. Zusätzlich ersetzen wir dabei auch den {language_name} durch den Namen der Sprache und {language_name} durch die URL der Sprachversion. Die Standardfunktion t(), die ich sonst zum Übersetzten von Template-Strings verwende, ermöglicht es leider nicht, auch Ersetzungen vorzunehmen.

Das Snippet wird dann in allen meinen Templates per snippet('language_switch'); eingesetzt.

Hinterlasse einen Kommentar

Verfügbare Formatierungen

Benutze Markdown-Befehle oder ihre HTML-Äquivalente, um deinen Kommentar zu formatieren:

Textauszeichnungen
*kursiv*, **fett**, ~~durchgestrichen~~, `Code` und <mark>markierter Text</mark>.
Listen
- Listenpunkt 1
- Listenpunkt 1
1. Nummerierte Liste 1
2. Nummerierte Liste 2
Zitate
> Zitierter Text
Code-Blöcke
```
// Ein einfacher Code-Block
```
```php
// Etwas PHP-Code
phpinfo();
```
Verlinkungen
[Link-Text](https://example.com)
Vollständige URLs werden automatisch in Links umgewandelt.

Auf der eigenen Website geantwortet? Sende eine Webmention!