Felix Riesterer: Idee umgesetzt - noch nicht das gelbe vom Ei

Beitrag lesen

Lieber Linuchs,

<p>Irgendwas ###Bitte gib die Postleitzahl oder den Namen deines Ortes ein###Please enter the postal code or the name of your place###Voer de postcode of de naam van uw plaats in### ist los am [datum].</p>

hmm. Verstehe ich das?

  • Irgendwas Bitte gib die Postleitzahl oder den Namen deines Ortes ein ist los am 1.1.1970.
  • Irgendwas Please enter the postal code or the name of your place ist los am 1.1.1970.
  • Irgendwas Voer de postcode of de naam van uw plaats in ist los am 1.1.1970.

Sollen so die Ergebnisse aussehen? Warum nicht so?

<p>{#new-event-for-date} <strong>{$date}</strong></p>
<ul>
  <li>
    <label>
      <span data-i18n="event-title"></span>
      <input name="event-title" type="text">
    </label>
  </li>
  <li>
    <label>
      <span data-i18n="zip"></span>
      <input name="event-zip" type="text">
    </label>
  </li>
</ul>

Nur zur Erläuterung: Ich unterscheide in meinen Templates zwischen Sprachbausteinen ({#key}) und Daten ({$var}).

Eine passende JSON-Datei müsste nun so aussehen:

{
  "event-title": {
    "de": "Titel der Veranstaltung",
    "en": "Event Title",
    "nl": "Titel van het evenement"
  },
  "new-event-for-date": {
    "de": "Neue Veranstaltung am",
    "en": "New event on",
    "nl": "Nieuw evenement op"
  },
  "zip": {
    "de": "Postleitzahl",
    "en": "ZIP Code",
    "nl": "Postcode"
  }
}

In PHP ist klar, wie man die jeweiligen Sprachbausteine bekommt:

$i18n = json_decode($dateipfad, true); // true = assoziatives Array
$lang = 'de'; // aktuelle Sprachwahl

function translate($key) {
  $text = $key; // fallback

  /* Kann man $i18n und $lang so in der
   * Funktion verfügbar machen? Ich arbeite
   * nur mit Objekten und die können auf
   * $this->i18n zugreifen.
   */
  global $i18n;
  global $lang;

  // default: Englisch - nur z.B.
  if (array_key_exists($key, $i18n)
    && array_key_exists('en', $i18n[$key])
  ) {
    $text = $i18n[$key]['en'];
  }

  if (array_key_exists($key, $i18n)
    && array_key_exists($lang, $i18n[$key])
  ) {
    $text = $i18n[$key][$lang];
  }

  return $text;
}

echo translate('event-title'); // Titel der Veranstaltung

In JavaScript ist das im Grunde das selbe. Stellen wir uns vor, die Daten lägen in der Variablen i18n:

const i18n = {}; // wird mit PHP oder AJAX befüllt
let currentLang = "de"; // aktuelle Sprachwahl

function translate (key) {
  let text = key; // fallback

  // default: Deutsch - nur z.B.
  if (i18n[key] && i18n[key].de) {
    text = i18n[key].de;
  }

  if (i18n[key] && i18n[key][currentLang]) {
    text = i18n[key][currentLang];
  }

  return text;
}

Der Datumswert für {$date} sollte bei deutscher Sprachausgabe das Format TT.MM.JJJJ haben, bei englischer MM/DD/YYYY. Keine Ahnung, wie das in den Niederlanden ist.

Liebe Grüße

Felix Riesterer