<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pf="http://www.daisy.org/ns/pipeline/functions" xmlns:d="http://www.daisy.org/ns/pipeline/data" xmlns:NormalizeLang="org.daisy.pipeline.common.NormalizeLang" version="3.0" exclude-result-prefixes="#all"> <xsl:function name="pf:i18n-translate" as="xs:string"> <xsl:param name="string" as="xs:string"/> <xsl:param name="language" as="xs:string"/> <xsl:param name="maps" as="element()*"/> <xsl:variable name="generic-language-code" select="tokenize(lower-case(pf:normalize-lang($language)),'-')[1]"/> <xsl:variable name="exact-language" select="(for $map in ($maps) return $map//d:translation[@string=$string]/d:text[@xml:lang=$language])[1]"/> <xsl:variable name="generic-language" select="if ($exact-language) then () else (for $map in ($maps) return $map//d:translation[@string=$string]/d:text[starts-with(@xml:lang,$generic-language-code)])[1]"/> <xsl:variable name="any-language" select="if ($exact-language or $generic-language) then () else (for $map in ($maps) return $map//d:translation[@string=$string]/d:text[1])[1]"/> <xsl:value-of select="($exact-language, $generic-language, $any-language)[1]"/> </xsl:function> <doc xmlns="http://www.oxygenxml.com/ns/doc/xsl"> <desc> <p>Normalizes a RFC 5646 language tag.</p> <p>The primary language subtag is converted to a two-letter language code from ISO 639-1 when possible.</p> </desc> </doc> <xsl:function name="pf:normalize-lang" as="xs:string"> <xsl:param name="language" as="xs:string"/> <xsl:try> <xsl:sequence select="NormalizeLang:normalize($language)"> </xsl:sequence> <xsl:catch> <xsl:sequence select="$language"/> </xsl:catch> </xsl:try> </xsl:function> </xsl:stylesheet>