Re: [ACTION-107] Locale Filter

On Fri, 2012-08-03 at 11:59 -0400, Shaun McCance wrote:
> On Fri, 2012-08-03 at 11:56 +0200, Felix Sasaki wrote:
> > Hi Shaun, all,
> > 
> > 
> > one more aspect about the locale filter data category. Currently we
> > specify basic filtering
> > http://tools.ietf.org/html/rfc4647#section-3.3.1
> > as the method to match locales in the localeFilter rule and in the
> > content. Would it make sense to use extended filtering
> > http://tools.ietf.org/html/rfc4647#section-3.3.2
> > and extended language ranges 
> > http://tools.ietf.org/html/rfc4647#section-2.2
> > instead?
> > 
> > 
> > This allows you to specify a language range like de-*-DE , which
> > matches e.g. de-latn-DE.
> > 
> > 
> > I have an action item from the i18n core working group to check this.
> 
> http://lists.w3.org/Archives/Public/public-multilingualweb-lt/2012Jul/0184.html
> 
>   I chose basic filtering because I think the algorithm for
>   extended filtering is tricky (but not impossible) to do in
>   XSLT 1.0, at least without EXSLT. Basic filtering is easy.
>   If anybody feels strongly that we should use extended
>   filtering, speak up. I'm not really opposed.
> 
> I can implement the extended filtering algorithm easily in
> Python for itstool. I was just trying to keep things easy
> for others. I'd like input from other implementers.

Actually turned out to not be as difficult as I'd thought to
implement in XSLT 1.0. Implementation is below. Tested on the
examples in RFC 4647, but not fully QA'd. No guarantees. Free
to use, modify, and redistribute without restriction.

Given the ease of implementation, I'm inclined to switch to
extended filtering. The current examples use "en-CA,fr-CA"
to restrict to Canadian locales. With extended filtering,
this is just "*-CA". I suspect restricting to a region will
be common. Objections?

<xsl:template name="extended-range-filter">
  <xsl:param name="range"/>
  <xsl:param name="language"/>
  <xsl:variable name="range_l"
                select="translate($range,
                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        'abcdefghijklmnopqrstuvwxyz')"/>
  <xsl:variable name="language_l"
                select="translate($language,
                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        'abcdefghijklmnopqrstuvwxyz')"/>
  <xsl:variable name="subrange">
    <xsl:choose>
      <xsl:when test="contains($range_l, '-')">
        <xsl:value-of select="substring-before($range_l, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$range_l"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="sublanguage">
    <xsl:choose>
      <xsl:when test="contains($language_l, '-')">
        <xsl:value-of select="substring-before($language_l, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$language_l"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="$subrange != $sublanguage and $subrange != '*'">
      <xsl:text>0</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="extended-range-filter-sub">
        <xsl:with-param name="range" select="$range_l"/>
        <xsl:with-param name="language" select="$language_l"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
<xsl:template name="extended-range-filter-sub">
  <xsl:param name="range"/>
  <xsl:param name="language"/>
  <xsl:variable name="subrange">
    <xsl:choose>
      <xsl:when test="contains($range, '-')">
        <xsl:value-of select="substring-before($range, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$range"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="sublanguage">
    <xsl:choose>
      <xsl:when test="contains($language, '-')">
        <xsl:value-of select="substring-before($language, '-')"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$language"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="$subrange = ''">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:when test="$subrange = '*'">
      <xsl:call-template name="extended-range-filter-sub">
        <xsl:with-param name="range"
                        select="substring-after($range, '-')"/>
        <xsl:with-param name="language" select="$language"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="$sublanguage = ''">
      <xsl:text>0</xsl:text>
    </xsl:when>
    <xsl:when test="$subrange = $sublanguage">
      <xsl:call-template name="extended-range-filter-sub">
        <xsl:with-param name="range"
                        select="substring-after($range, '-')"/>
        <xsl:with-param name="language"
                        select="substring-after($language, '-')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="string-length($sublanguage) = 1">
      <xsl:text>0</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="extended-range-filter-sub">
        <xsl:with-param name="range" select="$range"/>
        <xsl:with-param name="language"
                        select="substring-after($language, '-')"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Received on Friday, 3 August 2012 17:10:51 UTC