Sorteer vertaalde teksten

Drupal 8

In formulieren moeten er soms teksten worden vertaald die, voordat het formulier is gerenderd, gesorteerd moeten worden. In drupal 7 en eerder was dat geen probleem: een vertaalde tekst was zelf een tekst. Vanaf drupal 8 is een vertaalde tekst echter een object. En objecten sorteren geeft niet het gewenste resultaat.

Als voorbeeld gebruik ik in een formulier een radio knoppen element waarin een taal uit alle aanwezige talen geselecteerd kan worden. De talen moeten voor iedere ingestelde taal op de taalnaam gesorteerd zijn.
De in de code gebruikte $this→t($language→getName()) levert dus een object op. Er zijn twee manieren om er een string van te maken, benodigd voor het sorteren:

  1. (string) $this→t($language→getName())
  2. $this→t($language→getName())→__toString()

De tweede methode is veiliger en aan te bevelen.

Om te sorteren wordt asort gebruikt, want we willen natuurlijk de sleutels van de tabel ($langcode) niet kwijtraken. Ze zijn nodig om te weten welke optie gekozen is.
Afhankelijk van de context moet in plaats van:
$languages = $this→languageManager→getLanguages();
gekozen worden voor
$languages = \Drupal::languageManager()→getLanguages();.
Evenals voor $this→t() of t(). Indien mogelijk, gebruik dan altijd $this→…

  $languages = $this->languageManager->getLanguages();
  $options = [];
  foreach ($languages as $langcode => $language) {
    $options[$langcode] = $this->t($language->getName())->__toString();
  }
  asort($options);
 
  $form['languages'] = [
    '#type' => 'radios',
    '#title' => $this->t('Select your language'),
    '#default_value' => $settings['languages'],
    '#options' => $options,
  ];