Ga naar hoofdinhoud

Contacteer ons op +32 2 306 02 11 of mail ons op info@desk02.be

Analyse van de Drupal taal switcher

De locale module in Drupal voorziet een blok om van taal te veranderen. Dit blok doet niets anders dan de correcte taal prefix in de url aan te passen. De taalswitcher op deze manier gebruiken resulteert enkel in de weergave van dezelfde node, doch met een vertaalde interface. De code die dit blok genereert introduceert tevens een nieuwe hook hook_translation_link_alter() die andere modules toelaat de links in het language switcher-blok aan te passen.

De content translation module implementeert deze hook om een link naar de vertaalde node te voorzien wanneer de huidige node deel uitmaakt van een translation set (tnid kolom in de node tabel). De implementatie van deze hook is een beetje bijzonder door het feit dat het de werking van het language switcher-blok wijzigt op een manier die inconsistent kan lijken.

Je merkt dit gedrag slechts op wanneer je meer dan twee talen geactiveerd hebt. Als voorbeeld nemen we het geval waar de talen 'Engels, Nederlands en Frans' geactiveerd zijn. Ook hebben we de "Enabled, with translation"-optie geactiveerd voor het content type Page. Het language switcher-blok is actief in één van de regions en de language negotiation is ingesteld op één van de path prefix opties.

Bij het aanmaken van je eerste Page node zal je merken dat de language switcher een link naar deze node toont adhv de prefixen van alle geactiveerde talen. Op deze links klikken blijft de huidige node tonen met alleen de interface die van taal verandert. Dit is net hetzelfde gedrag dan wanneer alleen de locale module geactiveerd is (en dus niet de Content Translation-module).

Als je op translate klikt en je creëert een vertaling voor de node, dan zal je merken dat de language switcher - nadat je bewaart hebt - nog maar twee van de drie talen weergeeft. Omdat er geen vertaling van de node in de derde taal is, verwijdert de Content Translation-module deze link. Je zou nu ook kunnen argumenteren dat wanneer er slechts één node was, er ook geen vertalingen waren en dat het blok dan slechts één enkele link had moeten tonen ipv drie.

Het blok gedraagt zich zo omdat de Content Translation-module alleen de links aanpast wanneer de huidige node deel uitmaakt van een translationset. Een node maakt deel uit van een translation set wanneer de tnid waarde in de node tabel verschillend is van 0. Deze waarde is de node id van de bron-node van de translation set.
Wanneer je een eerste node van een vertaalbaar content-type aanmaakt, dan zal de tnid waarde voor die node 0 zijn. Wanneer je de eerste vertaling aanmaakt, dan zal de tnid waarde van deze nieuwe node én de bron node gezet worden op de nid waarde van de bron node. De waarde wordt terug op 0 gezet waneer één van de beide nodes verwijdert wordt.

Dit gedrag verrast vele mensen (en klanten) en de meesten vinden het niet helemaal logisch. Wanneer je echter vraagt hoe een language switcher blok zich dan wel zou moeten gedragen, dan zijn de antwoorden ook niet altijd even consistent. Inconsistentie is een trend bij alles wat met internationalisatie en lokalisatie van websites en applicaties in het algemeen te maken heeft. Specificeren hoe een language switcher moet werken wordt nog moeilijker wanneer er meerdere landen bij betrokken zijn .

Wanneer je een Drupal project start dat meerdere talen zal hebben, zorg er dan voor dat je de werking van de meertaligheid in het algemeen  - én de werking van de language switcher in het bijzonder - op de home pagina, node pagina’s, views en andere overzichten beschrijft.

Als je hier pas aan begint te denken aan het einde van het proces kan je voor verrassingen komen te staan.

Wat zijn dan mogelijke oplossingen voor het inconsistent gedrag van de language switcher?

Er is bijvoorbeeld de translation 404 module die aangeeft dat de huidige pagina niet beschikbaar is in de gewenste taal door een 404 pagina weer te geven ipv alleen de interface te vertalen, zoals de standaard module zou doen.

Op deze site zal de language switcher de bezoeker altijd naar de home pagina in de gewenste taal sturen. Ook al is dit vervelend als je van taal wilt veranderen op de contact pagina, maar dan is het tenminste consistent en gemakkelijk uit te leggen.

Om te kunnen bepalen wat de beste (of minst verwarrende) oplossing is, dan zouden we moeten weten hoe vaak zo'n language switcher eigenlijk gebruikt wordt. Naar mijn persoonlijke inschatting zijn er niet veel mensen die werkelijk gebruik maken van de language switcher. Als dat correct is, denk ik dat een switcher die eenvoudigweg naar de home page in de gekozen taal verwijst geen slechte oplossing is.

Misschien zouden we op de detail pagina’s ook nog een gewone link naar de beschikbare vertalingen kunnen weergeven om de zeldzame situatie, waarbij iemand op een pagina terechtkomt met de juiste content maar in de foute taal, te kunnen opvangen.

Ik ben echt benieuwd naar patronen in gebruik van language switchers. Als je hier data of een mening over hebt, deel ze hieronder gerust mee.

Ik zal deze post opvolgen met een blogpost over de taal negotiatie in Drupal. Dat is ook niet altijd even consistent,  maar- net als language switchers - heeft ook iedereen er een mening over.

Tags: Drupal, i18n

Reacties

google is the best.

Active Translation (http://drupal.org/project/active_translation) resolves the issue that a Language disappears from the language switcher block with three or more languages.
If a node has not been translated into the current language, it displays the original node as a fallback, with the option to display a message about the unavailable translation.

I find it helpful to show both the lge switcher and the translation links in the nodes themselves, but I can't say which is used more often, since the site is not yet online. ;)
I guess user use the lge switcher block more often to translate the interface, instead of content.

Another quick question: how did you manage to display the comments of one node on the translated node and vice versa? I used a View with a relationship, but maybe there's another way.

@Narretz: I hacked core :)
It was the easiest way and that way we could use the standard node view.

Olivier, please, how did you do that? Making language switcher always leading a visitor to the home page in that language?

Yes, how did you do that: having the language switcher always send the visitor to the home page?
Thanks
Alan

This is a custom block:

/**
 * Copy of the locale_block function but altered to point to the front page when no translation of the node is available.
 * When not viewing a specific node we change the language prefix which is the default behaviour.
 */
function mymodule_block($op = 'list', $delta = 0) {
  global $language;
 
  if ($op == 'list') {
    $block[0]['info'] = t('Desk02 language switcher');
    // Not worth caching.
    $block[0]['cache'] = BLOCK_NO_CACHE;
    return $block;
  }
  elseif ($op == 'view') {
    $block['subject'] = t('Languages');
    $languages = language_list('enabled');
    $links = array();
    foreach ($languages[1] as $lang) {
      $links[$lang->language] = array(
        'href'       => $lang->language == $language->language ? $_GET['q'] : '<front>',
        'title'      => $lang->native,
        'language'   => $lang,
        'attributes' => array('class' => 'language-link'),
      );
    }
    $block['content'] = theme('links', $links, array());
    return $block;
  }
}

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.
  • Adressen van webpagina's en e-mailadressen worden automatisch naar links omgezet.
  • Toegelaten HTML-tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Regels en paragrafen worden automatisch gesplitst.
  • U kan syntax highlighting toepassen door gebruik te maken van volgende tags: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby> De ondersteunde tag formaten zijn: <foo>, [foo]
  • Feweb
  • Drupal
  • AnySurfer, Belgisch kwaliteitslabel voor toegankelijke websites

© Desk02 • Sitemap