Texte übersetzen: Sprachdateien und der t-Filter
Wie die Sprachdateien aufgebaut sind, wie sie ausgewählt werden — und warum derzeit immer die Standardsprache gewinnt.
Für EntwicklerVoraussetzungen
- Recht: website:write
Sprachdateien liegen unter `locales/<code>.json`. Ein `.default` im Dateinamen wird beim Einlesen abgeschnitten: aus `de.default.json` wird der Schlüssel `de`.
Der Inhalt ist verschachteltes JSON, etwa `{"header":{"reserve":"Reservieren","menu":"Menü"},"footer":{"closed":"Geschlossen"}}`. Im Template greifen Sie darauf mit einem Punktpfad zu: `{{ "header.reserve" | t }}`.
Fehlt ein Eintrag, gibt der Filter den Schlüssel selbst zurück. Eine fehlende Übersetzung sieht man also im Ergebnis und muss nicht danach suchen.
Der ganze Inhalt der aktiven Sprachdatei steht zusätzlich als Objekt `locales` bereit, die Kennung der aktiven Sprache als `locale`.
Eine Einschränkung, die man kennen muss: Die Sprache wird beim Rendern derzeit NICHT aus der Anfrage übernommen. Gerendert wird immer mit der Standardsprache des Themes. Eine zweite Sprachdatei wird zwar eingelesen und lässt sich pflegen, kommt auf der veröffentlichten Seite aber nicht zum Zug.
Codebeispiele
{ "kopf": { "reservieren": "Tisch reservieren", "menue_oeffnen": "Menü öffnen" }, "karte": { "leer": "Die Karte wird gerade überarbeitet." }, "fuss": { "oeffnungszeiten": "Öffnungszeiten", "geschlossen": "Geschlossen" }}{ "kopf": { "reservieren": "Book a table", "menue_oeffnen": "Open menu" }, "karte": { "leer": "Our menu is being updated." }, "fuss": { "oeffnungszeiten": "Opening hours", "geschlossen": "Closed" }}<h2>{{ 'fuss.oeffnungszeiten' | t }}</h2><ul>{%- for tag in restaurant.opening_hours %} <li>{{ tag.label }}: {% if tag.closed %}{{ 'fuss.geschlossen' | t }}{% else %}{{ tag.times }}{% endif %}</li>{%- endfor %}</ul>[{{ 'fuss.geschlossen' | t }}]mit render: {% render 'uebersetzt' %}
mit include: {% include 'uebersetzt' %}Aktive Sprache: {{ locale }}
Über den Filter: {{ 'fuss.geschlossen' | t }}
Direkt aus dem Objekt: {{ locales.fuss.geschlossen }}Siehe auch
- Die eigenen Liquid-FilterSieben Filter kommen von TacticTable dazu — alle übrigen sind die von LiquidJS.
- Alle Objekte, die eine Vorlage bekommtDie vollständige Liste — was nicht darin steht, ist im Template leer, ohne Fehlermeldung.
- Teilstücke: render und includeWiederverwendbares Markup aus snippets/ — und der eine Unterschied zwischen render und include, an dem die meisten Übersetzungen scheitern.