<?xml version="1.0"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:l = "http://herbaer.de/xmlns/20141210/localization"
  xmlns:sk = "http://herbaer.de/xmlns/20150106/skeleton"
  xmlns:ti = "http://herbaer.de/xmlns/201500703/transinfo/"
  xmlns = "http://www.w3.org/1999/xhtml"
  exclude-result-prefixes = "d ht l ti sk"
  version = "1.0"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>xhtml_post.xslt</title>
  <subtitle>Nachbearbeitung übersetzter XHTML-Dateien</subtitle>
  <date>2015-08-15</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:para>
Dateipfad des Quelltextes der Lokalisierungsdatei
</d:para>
<xsl:param name="p_localsrc" select="'../style/local.xml.de'"/>

<d:para>
Dateipfad der übersetzten Lokalisierungsdatei
</d:para>
<xsl:param name="p_localweb" select="'../../docroot/local/local.xml.de.'"/>

<d:para>
Einige XSLT-Transformationen, die auf die übersetzte Datei angewandt werden,
beachten nicht die Hinweise zur Übersetzung.
Diese Basisnamen dieser Transformationen
(Dateinamen ohne das Suffix <d:literal>.xslt</d:literal>)
sind hier aufgelistet, getrennt durch das Zeichen "<d:literal>,</d:literal>".
Im Falle einer solchen Transformation wird hier ein Übersetzungshinweis eingefügt.
</d:para>
<xsl:param name="p_excptxslt" select="'v'"/>

<d:para>
Das Attribut @ti:machine enthält einen Hinweis auf die benutzte Übersetzungs-Maschine.
Wenn der Wert des Attributs eine der nachfolgend aufgeführten Bezeichnungen
als Teilzeichenkette enthält,
wird die erste passende Bezeichnung als neuer Attributwert ausgegeben.
Sonst bleibt das Attribut unverändert, falls es nicht besonders behandelt wird.
Dieser Parameter ist eine Komma-getrennte Liste der Bezeichnungen
</d:para>
<xsl:param name="p_transnames" select="'google,mysql'"/>

<d:para>
Wurzelelement des Quelltextes der Lokalisierungsdatei
</d:para>
<xsl:variable name="g_locsrcroot" select="document($p_localsrc)/*"/>

<d:para>
Wurzelelement der übersetzten Lokalisierungsdatei
</d:para>
<xsl:variable name="g_locwebroot" select="document($p_localweb)/*"/>

<d:para>
Verweist das Quelldokument auf eine XSLT-Transformation,
die einen Übersetzungshinweis verarbeitet?
Dann braucht der Übersetzunghinweis hier nicht behandelt zu werden.
</d:para>
<xsl:variable name="g_handle_trhint">
  <xsl:choose>
    <xsl:when test="/processing-instruction() [name(.) = 'xml-stylesheet']">
      <!--
          Im Wert der Verarbeitungsanweisung werden vor und nach dem Zeichen '='
          Leerzeichen eingefügt.
      -->
      <xsl:variable name="pi">
        <xsl:call-template name="txt.replacechars">
          <xsl:with-param name="txt" select="/processing-instruction() [name(.) = 'xml-stylesheet']"
          />
          <xsl:with-param name="chars" select="'='"/>
          <xsl:with-param name="list" select="' = '"/>
        </xsl:call-template>
      </xsl:variable>
      <!-- Basis-Dateiname der Transformation in Kommata -->
      <xsl:variable name="basefn">
        <xsl:text>,</xsl:text>
        <xsl:call-template name="txt.basefilename">
          <xsl:with-param
            name = "txt"
            select = "
              substring-before (
              substring-after (normalize-space ($pi), 'href = &quot;'), '&quot;')
            "
          />
        </xsl:call-template>
        <xsl:text>,</xsl:text>
      </xsl:variable>
      <!--
        Liste der "Ausnahme-Transformationen" ohne Leerzeichen mit zusätzlichen Kommata
      -->
      <xsl:variable name="exlist" select="concat (',', translate ($p_excptxslt, ' ', ''), ',')"
      />
      <xsl:choose>
        <xsl:when test="contains ($exlist, $basefn)">yes</xsl:when>
        <xsl:otherwise>no</xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>yes</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

<d:para>
Vorlage <d:literal>txt.split</d:literal>
</d:para>
<xsl:include href="/pool/txt.xslt"/>

<d:para>
Vorlage <d:literal>list.map_once</d:literal>
</d:para>
<xsl:include href="/pool/list.xslt"/>

<xsl:output method="xml" encoding="utf-8"/>

<xsl:template match="/">
  <xsl:apply-templates select="text() | processing-instruction() | comment() | *"/>
</xsl:template>

<d:para>
Elemente werden "hohl" kopiert.
Verschobene Elemente werden entfernt,
nur verschobene Verweise werden am Ende angefügt.
</d:para>
<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="@* | *[not (@ti:hint = 'moved')] | text()"/>
    <xsl:apply-templates select="* [@ti:hint = 'moved']"/>
  </xsl:copy>
</xsl:template>

<d:para>
Ein verschobener Verweis
</d:para>
<xsl:template match="ht:a [@ti:hint = 'moved']">
  <xsl:text> </xsl:text>
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:text>[</xsl:text>
    <xsl:apply-templates select="* | text()"/>
    <xsl:text>]</xsl:text>
  </xsl:copy>
</xsl:template>

<d:para>
Andere HTML-Elemente, die aus dem Textfluss herausgenommen sind,
werden ignoriert.
</d:para>
<xsl:template match="ht:* [@ti:hint = 'moved']"/>

<d:para>
<d:tag class="element">sk:part</d:tag>-Elemente werden zu
<d:tag class="element">span</d:tag>-Elementen
</d:para>
<xsl:template match="sk:part">
  <span>
    <xsl:apply-templates select="@* | * | text()"/>
  </span>
</xsl:template>

<d:para>
Verarbeitungsanweisungen und Attribute werden kopiert
</d:para>
<xsl:template match="processing-instruction() | @*">
  <xsl:copy-of select="."/>
</xsl:template>

<d:para>
ti:machine - Attribute werden nur dann kopiert,
wenn der Übersetzunghinweis nicht in dieser Transformation verarbeitet wird.
</d:para>
<xsl:template match="@ti:machine">
  <xsl:if test="$g_handle_trhint != 'yes'">
    <xsl:attribute name="ti:machine">
      <xsl:call-template name="list.map_once">
        <xsl:with-param name="list" select="$p_transnames"/>
        <xsl:with-param name="mapper" select="."/>
        <xsl:with-param name="sep" select="','"/>
      </xsl:call-template>
    </xsl:attribute>
  </xsl:if>
</xsl:template>

<d:para>
Die passende Bezeichnung finden
</d:para>
<xsl:template match="@ti:machine" mode="list.apply">
  <!-- eine Bezeichnung eines Übersetzers -->
  <xsl:param name="item"/>
  <xsl:if test="contains (., $item)">
    <xsl:value-of select="$item"/>
  </xsl:if>
</xsl:template>

<d:para>
Andere ti:* - Attribute werden nicht kopiert.
</d:para>
<xsl:template match="@ti:*"/>

<d:para>
Auch das HTML-Attribut
<d:tag class="attribute">translate</d:tag>
wird nicht kopiert.
</d:para>
<xsl:template match="@translate"/>

<d:para>
In das
<d:tag class="element">body</d:tag>-Element
wird ein Verweis auf die Übersetzungsmaschine eingefügt,
wenn das Dokument nicht auf ein Stylesheet verweist,
das den Übersetzungshinweis verarbeitet.
</d:para>
<xsl:template match="ht:body">
  <xsl:copy>
  <xsl:apply-templates select="@*"/>
  <xsl:choose>
    <xsl:when test="$g_handle_trhint != 'yes'">
      <xsl:apply-templates select="*"/>
    </xsl:when>
    <xsl:when test="starts-with (local-name(*[1]), 'h')">
      <xsl:apply-templates select="*[1]"/>
      <xsl:apply-templates select="/*/@ti:machine" mode="hint"/>
      <xsl:apply-templates select="*[position() &gt; 1]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="/*/@ti:machine" mode="hint"/>
      <xsl:apply-templates select="*"/>
    </xsl:otherwise>
  </xsl:choose>
  </xsl:copy>
</xsl:template>

<d:para>
Hinweis auf die maschinelle Übersetzung
</d:para>
<xsl:template match="@ti:machine" mode="hint">
  <div class="machine">
    <xsl:choose>
      <xsl:when test="contains (., 'google')">
        <p>
          <a href="http://translate.google.com" class="machine_link" target="_blank">
            <img src="/local/trans_by_google.png"/>
          </a>
        </p>
      </xsl:when>
      <xsl:when test="contains (., 'mysql')">
        <p>
          <a href="http://translate.google.com" class="machine_link" target="_blank">
            <img src="/local/trans_by_google.png"/>
          </a>
        </p>
      </xsl:when>
    </xsl:choose>
    <p>
      <xsl:call-template name="gettext">
        <xsl:with-param name="id" select="'maschinelle_uebersetzung'"/>
      </xsl:call-template>
    </p>
  </div>
</xsl:template>

<d:para>
Übersetzten Text anhand der ID im Quelltext der Lokalisierungsdatei
</d:para>
<xsl:template name="gettext">
  <!-- ID im Lokalisierungs-Quelltext -->
  <xsl:param name="id"/>
  <xsl:variable name="pos" select="count ($g_locsrcroot/l:t[@id = $id]/preceding-sibling::l:t) + 1"
  />
  <xsl:value-of select="$g_locwebroot/l:t[position() = $pos]"/>
</xsl:template>

</xsl:stylesheet>
