Bilinguales Kirby

Vielleicht hat es der ein oder andere bemerkt, ich versuche hier gerade etwas zweisprachiger zu werden.

Meine letzten Posts hier, konnte man auch immer auf englisch nachlesen. Das soll auch in Zukunft so bleiben und ich möchte außerdem alle anderen Seiten Schritt für Schritt übersetzen.

Ganz so begeistert von den Bordmitteln, die von Kirby kommen, bin ich dann doch nicht, aber es lässt sich machen. Ich habe mir dazu ein kleines Snippet geschrieben und meinen Blog-Header noch etwas modifiziert.

Das Problem ist, dass Kirby, wenn eine Übersetzung nicht vorhanden ist, den Text einfach auf Deutsch anzeigt. Das will ich nicht, wenn keine Übersetzung vorhanden ist, soll man auch nicht auf den Sprachlink klicken können. Dazu habe ich den Standard-Code für den Sprachwechsler ein wenig modifiziert.

So funktioniert es besser

Im Snippet selber versuche ich zunächst herauszufinden, welches Template der aktuelle Beitrag benutzt (der Templatename entspricht dem ersten Teil des Dateinamens). Mit dieser Information kann ich dann nachsehen, ob es eine entsprechende Datei für die englische (oder deutsche, je nachdem) Version des Textes gibt. Ist diese vorhanden, gibt es einen Link, ansonsten ist die Übersetzung nicht anwählbar.

Hier ein Ausschnitt:

<?php foreach(c::get('lang.available') as $lang) : ?>
    <?php if($lang != c::get('lang.current')) : ?>
        <?php if($page->files()->find($page->template().'.'.$lang.'.md')) : ?>

Damit man in der URL das "de" nicht einfach zu einem "en" machen kann und dann doch wieder die Deutsche Version (unter der "en"-URL) angezeigt bekommt, habe ich noch folgendes in mein Template (bzw. das header-snippet, welches ich benutze) eingebaut:

<?php
    $lang = c::get('lang.current');
    $other = ($lang == 'de') ? 'en' : 'de';
    $template = $page->template();
    if($page->files()->find($template.'.'.$lang.'.md') == NULL) {
        header ('HTTP/1.1 303 See Other');
        header('Location: '.$page->url($other));
    }
?>

Zunächst gucke ich, welche Sprache gerade gewählt ist und suche mir das Gegenstück dazu. Dann folgt wieder der Test, ob es eine Übersetzung gibt. Wenn nicht, verweise ich auf die deutsche Version.

Ich bin mir noch nicht sicher, ob das mit dem 303-Header so wirklich korrekt ist, es erschien mir aber die beste Variante zu sein. Diese Variante funktioniert natürlich auch nur bei zwei Sprachen, gibt es mehrere, muss man noch mal Hand anlegen.

Meine Snippets gibt es, wie immer, auf GitHub.

Wie geht's von hier aus weiter?

Wenn du diesen Beitrag (nicht) gut findest, kannst du ihn kommentieren, woanders darüber schreiben oder ihn teilen. Wenn du mehr Beiträge dieser Art lesen willst, kannst du mir via RSS oder ActivityPub folgen, oder du kannst kannst dir ähnliche Beiträge ansehen.