Content en meertaligheid
Veel content-gedreven websites hebben genoeg aan de basisfunctionaliteit van een content repository. Content wordt gestructureerd in het hiërarchische model van folders. Content wordt daarnaast via een workflow gepubliceerd en oude versies worden gearchiveerd. Het datamodel van nodes en properties is hier heel geschikt voor (zie de eerdere post Databases versus content repositories).
Het wordt pas weer lastiger als een content gedreven website in meerdere talen beschikbaar moet zijn. Dit geeft weer een extra dimensie aan de content zodat het niet direct te vertalen is naar een hiërarchische structuur. Let op het verschil tussen internationalization (i18n) en localization (l10n). Een content repository moet ingericht worden voor i18n zodat de website l10n kan zijn.
Drie veel toegepaste methodes van i18n in een content repository zijn:
1. De content voor elke taal opslaan in een aparte tak binnen de hiërarchie. Vrij dicht bij de root van de hiërarchie zijn de talen zichtbaar in de node structuur. Dit werkt zeer goed voor websites waarbij de content in de verschillende talen niet dezelfde inhoud hoeven te hebben. Een Nederlandse informatieve site heeft vaak een Engels gedeelte voor de buitenlandse bezoekers. De Nederlandse informatie is dan vaak veel uitgebreider en gedetailleerde dan die in het Engels. De sitemap van beide gedeeltes is dan niet gelijk. De website moet weten waar in de hiërarchie de talen beginnen.
2. Binnen één node properties voor alle talen. Elke eigenschap van de content krijgt dan meerdere properties. Bijvoorbeeld voor de titel van een artikel is er een title_nl en een title_en property in een node. Dit kan worden toegepast als talen in combinatie verplicht ingevuld moet worden. Voorbeelden hiervan zijn publicaties van overheden in meertalige regio’s (Friesland en België). De website moet weten wat de naam conventie is voor de properties om de juiste content weer te geven.
3. Elke node heeft een property die aangeeft in welke taal de content is. Deze taal property kan in een mixin gedefinieerd worden en toegewezen worden aan elke node. De nodes met dezelfde content in een andere taal moeten gegroepeerd worden in de repository. Dit kan door een overkoepelende node te gebruiken waarbij de taal nodes eronder hangen. De website moet dan weten dat de vertaalde content onder de overkoepelende node hangt.
Hippo CMS
Om eens te kijken wat de makkelijkste manier van meertaligheid is binnen Hippo CMS zijn we hiermee aan het experimenteren geweest op de Hippo Forge Friday van 30 oktober 2009. Ik wilde zo min mogelijk code schrijven en toch een meertalige site neerzetten. Met het eindresultaat na een middag rondklikken in de CMS console was ik zeer tevreden. Nul regels code en een meertalige website op basis van de domeinnaam. De uiteindelijke oplossing bestaat uit een combinatie van manier 1 en 3 van hierboven. Als je het onderstaande niet kunt volgen is het handig om Hippo CMS en Hippo Site even te installeren en te starten.
Hippo CMS en Hippo Site is heel makkelijk draaiend te krijgen via een maven archetype. (Zie http://www.onehippo.org/site-toolkit/getting+started/generate+project). Na een mvn install is, via de maven jetty plugin, het CMS (jetty:run-war) en de HST (jetty:run) te starten.
Als het CMS en de Site draaien zijn er vier urls interessant
- CMS applicatie: http://localhost:8080/cms/ (geschikt voor redacteuren)
- CMS Console: http://localhost:8080/cms/console/ (geschikt voor ontwikkelaars)
- Gepubliceerde Site: http://localhost:8085/site/ (geschikt voor bezoekers)
- Preview Site: http://localhost:8085/site/preview/ (geschikt voor redacteuren)
Omdat de CMS console laat zien wat de achterliggende structuur is van het CMS en de Site is dat de meest interessante plek om te gaan zoeken naar de meertaligheid oplossing. Na het inloggen in de console is aan de linkerkant een hiërarchie te zien met mappen. Vijf mappen hiervan worden door de Site gebruikt om pagina’s op te bouwen.

Hippo CMS Console Tree
/hst:configuration
Deze map bevat de standaard site structuur van pagina’s, menu’s en componenten. Hier staat bijvoorbeeld in dat de demo site een home en about pagina heeft. Beide pagina’s hebben een header, een main menu en een body.
/content
Dit is de map waar het CMS zijn content laat. De submappen komen overeen met wat te zien is in de verkenner van het CMS.
/hst:vistualhosts
Dit is de map waar de hst:virtualhost nodes in staan. Elk request dat binnenkomt op de site (preview of gepubliceerd) wordt gemapped op deze virtualhost nodes. Als een bijpassende node wordt gevonden weet de HST waar de configuratie en content van de site te vinden is in de Hippo repository. Standaard wordt http://localhost:8085/site/ gemapped op /live/application en http://localhost:8085/site/preview/ op /preview/application
/live en /preview
Dit zijn de mappen waar facetselect nodes in staan om de content en hst:configuration te filteren op basis van properties. Deze mappen werden al gebruikt bij de virtualhost nodes. Een facetselect is een nodetype waarmee je een andere tak van de repository kunt dupliceren, maar dan gefilterd op basis van property waardes. Binnen /live/application staat een facetselect node met de naam hst:content. Deze facetselect wordt gebruikt om /content/documents/application te filteren op basis van hippostd:state=published. Dit heeft als effect dat alleen documenten uit het CMS die gepubliceerd zijn getoond worden. Hetzelfde gebeurd voor de hst:configuration zodat alleen gepubliceerde pagina’s getoond worden. Dit is precies wat de eis is voor een live site.
Hippo meertaligheid
Omdat de HST al in de repository rekening houdt met een andere site (pagina’s en content) per vistualhost (domein) is i18n manier 1 makkelijk te realiseren. Een nieuwe virtualhost verwijst naar nieuwe facetselects in /live en /preview. Deze facetselects verwijzen naar een nieuwe hst:configuration en een andere map in de content hiërarchie. I18n manier 3 werkt op basis van property waardes en dat doet een facetselect al standaard. Het enige wat nodig is, is een extra property op elk document dat specificeert in welke taal het is.
Genoeg achtergrondinformatie; laten we maar even gaan rondklikken. Bij het rondklikken zijn twee dingen belangrijk.
- Je moet altijd handmatig je wijzigingen wegschrijven naar de repository (zie rechtsboven in de console)
- Je moet af en toe de sessie met de repository resetten. Het treecomponent vernieuwt niet altijd goed. (zie rechtsboven in de console)
De nieuwe urls worden http://nl.hippo.local:8085/site en http://en.hippo.local:8085/site. In de hosts file van het besturingssysteem moeten nl.hippo.local en en.hippo.local even toegevoegd worden aan 127.0.0.1
Als eerste moeten er wat virstualhost nodes gemaakt worden om de domeinnamen af te vangen.
- Selecteer /hst:virtualhosts
- Voeg een nieuwe node toe (Naam = “local” en Primaire type = hst:virtualhost) en selecteer deze
- Voeg een nieuwe node toe (Naam = “hippo” en Primaire type = hst:virtualhost) en selecteer deze
- Selecteer /hst:virtualhosts/localhost
- Kopieer deze node naar /hst:virtualhosts/local/hippo/ en vul “en” in
- Verander de waarde van hst:sitename naar “application_en”
- Selecteer /hst:virtualhosts/localhost
- Kopieer deze node naar /hst:virtualhosts/local/hippo/ en vul “nl” in
- Verander de waarde van hst:sitename naar “application_nl”
- Klik op “write changes to repository” en bewaar alles.
Als je nu naar de nieuwe urls gaat geeft de applicatie een error, maar de HST reageert al wel op de nieuwe domeinen. Wat er nu fout gaat is dat de HST zoekt naar /live/application_en, maar die bestaat nog niet. Dit is makkelijk te verhelpen.
- Selecteer /live/application
- Kopieer deze node naar /live/ en vul “application_en” in
- Selecteer /live/application
- Kopieer deze node naar /live/ en vul “application_nl” in
- Doe de bovenstaande stappen ook voor /preview
- Klik op “write changes to repository” en bewaar alles.
Nu werken de nieuwe urls en de demo site komt weer te voorschijn. Op dit moment is er nog niets meertaligs aan. De volgende stap is dus om dat te gaan doen.
Voor i18n manier 1 kunnen we voor elke taal de hst:configuration kopiëren en de pagina’s aanpassen. Daarna moet alleen de property van hippo:docbase van /live/application_en/hst:configuration worden veranderd. Dit is veel geklik in de hst:configuration, maar niet heel erg indrukwekkend.
I18n manier 3 werkt op dezelfde hst:configuration en content structuur dus dat hebben we nu al. Het enige wat we moeten doen is zorgen dat er op een property wordt gefilterd.
- Selecteer /live/application_nl/hst:content
- Voeg een property toe (Vink multivalue aan, Naam = “hippo:facets” en waarde = “hippostd:language”)
- Voeg een property toe (Vink multivalue aan, Naam = “hippo:values” en waarde = “nl”)
- Voeg een property toe (Vink multivalue aan, Naam = “hippo: modes” en waarde = “select”)
- Selecteer /preview/application_nl/hst:content
- Voeg een property toe (Vink multivalue aan, Naam = “hippo:facets” en waarde = “hippostd:language”)
- Voeg een property toe (Vink multivalue aan, Naam = “hippo:values” en waarde = “nl”)
- Voeg een property toe (Vink multivalue aan, Naam = “hippo: modes” en waarde = “select”)
- Doe de bovenstaande stappen ook voor de engelse variant
- Klik op “write changes to repository” en bewaar alles.
Vanaf dit moment wordt de content gefilterd op de hippostd:language. Elk document dat de property hippostd:language heeft – en de overeenkomstige waarde – wordt getoond. Ook alle documenten die geen property hippostd:language worden getoond. Omdat nog geen enkel document de hippostd:language property heeft worden ze allemaal weegegeven. Toevoegen van de property gaat als volgt
- Selecteer /content/documents/application/common/homepage (Deze node is van het type hippo:handle
- Doe een checkout van de node. (bovenin “Check In/Out”
- Selecteer /content/documents/application/common/homepage/homepage (Deze node is van het type application:textdocument
- Scroll rechts naar beneden en selecteer de Mixin hippostd:languageable (Nu staat de mixin in het lijstje bovenaan)
- Voeg een property toe (Naam = “hippostd:language” en waarde = “en”)
- Kopieer deze node naar /content/documents/application/common/homepage
- Nu staat er een nieuwe node bij selecteer deze tweede
- Verander de waarde van hippostd:language naar “nl”
- Verander in de application:body node de hippostd:content naar een Nederlandse tekst.
- Klik op “write changes to repository” en bewaar alles.
- Selecteer weer /content/documents/application/common/homepage
- Doe een checkin van de node. (bovenin “Check In/Out”
Als alles goed is gegaan is de homepage op http://nl.hippo.local:8085/site in het Nederlands en op http://en.hippo.local:8085/site nog steeds in het Engels.
Conclusie
Zoals ik al eerder schreef ben ik zeer tevreden over het resultaat. Blijkbaar is de Hippo Repository en Hippo Site Toolkit flexibel genoeg om meertaligheid toe te voegen aan een site. Wel moet er nog wat gebeuren in het CMS om de meertaligheid gebruiksvriendelijker af te handelen, dat vereist echter wat programmeerwerk.

Reageer
RSS feed for comments on this post · TrackBack URI