Интернационализация XSLT с PHP - PullRequest
1 голос
/ 03 февраля 2012

Я использую XSLT в качестве движка шаблонов в моей среде PHP. Я установил некоторый текст для сценария Renderer, который преобразует его в xml и передает в XSLTProcessor:

<?php
class IndexController extends ActionAbstract {
    public function doAuth() {
        $this->_Renderer->some_text = 'Translatable text';
    }
}
?>

Вид выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>

    <xsl:template match="/">
        <html>
            <head><title>Index.xsl</title></head>
            <body>
                Here is some text to be translated <br/>
                <xsl:value-of select="root/some_text"/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

Итак, у меня есть 2 типа текста в представлениях:

  • Динамический (устанавливается из ActionController $ this -> _ Renderer-> some_text = 'Transurable text')
  • в жестком представлении (вот текст для перевода)

Я могу использовать словарь xml для перевода Harcoded текстов в xslt (используя функцию document()), но как при переводе текстов, заданных из ActionController?

Как лучше всего переводить тексты в моих представлениях?

UPDATE: Можно ли напечатать значение по умолчанию, если перевод текста не найден?

Спасибо

1 Ответ

2 голосов
/ 04 февраля 2012

Лучше всего использовать ключи xslt - примеры можно найти здесь: http://www.learn -xslt-tutorial.com / Working-with-Keys.cfm

С точки зрения вашего примера это выглядело бы как (я не скомпилировал его, так что, возможно, есть какая-то опечатка или ошибка):

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml"/>
        <xsl:key name="keyDict" match="entry" use="key"/>
        <xsl:param name="text_to_translate2" select="root/some_text"/>

        <xsl:template match="/">
            <html>
                <head><title>Index.xsl</title></head>
                <body>
                    <!-- Here is some text to be translated -->
                    <xsl:value-of select="key('keyDict','text_to_translate1')/value"/> <br/>
                    <xsl:value-of select="key('keyDict',$text_to_translate2)/value"/>
                </body>
            </html>
        </xsl:template>

    </xsl:stylesheet>

И вам понадобятся xml со структурой:

    <entry>
        <key>text_to_transalte1</key>
        <value>some text1</value>
    </entry>
    <entry>
        ...
    </entry>

РЕДАКТИРОВАТЬ: Для значения по умолчанию просто добавьте в записи в XML:

    <keyDict>
        <entry>
            <key>text_to_transalte1</key>
            <value>some text1</value>
        </entry>
        <entry>
            ...
        </entry>
        <default><value>No translation found</value></default>
    </keyDict>

Или, если вы хотите установить значение по умолчанию для каждого ключа, равное ключу (что я бы сказал, обычно), вы можете определить новый шаблон:

    <xsl:template name="dictLookup">
        <xsl:param name="key"/>
        <xsl:variable name="result" select="key('keyDict',$key)/value"/>
        <xsl:choose>
            <xsl:when test="not($result)">
                <xsl:value-of select="$key"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$result"/>
            <xsl:otherwise>
        </xsl:choose>
    </xsl:template>

и затем вызовите этот шаблон с параметром:

    <xsl:call-template name="dictLookup">
        <xsl:with-param name="key" value="some value"/>
    </xsl:call-template>

Вы можете даже добавить другой параметр с именем default для вызова тамплета следующим образом:

    <xsl:call-template name="dictLookup">
        <xsl:with-param name="key" value="some value"/>
        <xsl:with-param name="default" value="default value"/>
    </xsl:call-template>

Я надеюсь, что это отвечает на ваш вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...