Language Switch
Frontend language switch for multilingual sites
Description
This utility adds a language switch for all languages of the site (when using multilanguage the right way).
It takes its information from the navigation and fl-languages datasources.
Parameters are the most difficult part to implement as they come in one language only. It is therefore necessary to look up a parameter's translation in a datasource. For example: If your page is products and the parameter is $prodctgroup, you will need a datasource that lists all product groups in all languages. The xml shows an example. For sites with many parameters on different pages it might be useful to apply a template, placed on each page, from within the utility.
XSLT
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="fl-languages"> <ul class="nav__language"> <xsl:apply-templates select="supported-languages/item" /> </ul> </xsl:template> <xsl:template match="supported-languages/item"> <li class="nav__language__item"> <xsl:if test="/data/fl-languages/current-language/@handle = current()/@handle"> <xsl:attribute name="class">nav__language__item nav__language__item--active</xsl:attribute> </xsl:if> <a class="nav__language__item__link"> <xsl:attribute name="href"><xsl:value-of select="concat($root,'/',@handle)" /> <xsl:apply-templates select="/data/navigation" mode="language"> <xsl:with-param name="lang" select="@handle" /> </xsl:apply-templates> <!-- PARAMETERS START --> <xsl:value-of select="concat('/', /data/DATASOURCENAME/entry/FIELD/item[@lang = current()/@handle]/@handle)" /> <!-- PARAMETERS END --> </xsl:attribute> <xsl:value-of select="@handle" /> </a> </li> </xsl:template> <xsl:template match="navigation" mode="language"> <xsl:param name="lang" select="''" /> <xsl:apply-templates select="page" mode="language"> <xsl:with-param name="lang" select="$lang" /> </xsl:apply-templates> </xsl:template> <xsl:template match="page" mode="language"> <xsl:param name="lang" select="''" /> <xsl:if test="descendant-or-self::node()[@id = $current-page-id]"> /<xsl:value-of select="item[@lang = $lang]/@handle" /> </xsl:if> <xsl:if test="descendant-or-self::node()[@id = $current-page-id]"> <xsl:apply-templates select="page" mode="language"> <xsl:with-param name="lang" select="$lang" /> </xsl:apply-templates> </xsl:if> </xsl:template> </xsl:stylesheet>