gettext и XSLT

Crys

Двинутый новичок
gettext и XSLT

САБЖ. Кто-нибудь пытался совместить gettext и XSLT? Если да, то каким образом? :)
 

Crys

Двинутый новичок
HTML:

echo _('Hello');

XSLT:

<xsl:value-of select="php:function('_','Hello')"/>


А если XSLT используется не только для PHP?
Делать так?

$lang->appendChild(new DOMElement('hello',_('Hello')))
А в XSLT:
<xsl:value-of select="lang/hello"/>

Но тогда теряем преимущество. Я могу заранее не знать, какое слово мне понадобится в шаблоне.

-~{}~ 21.02.07 16:57:

Кроме того, при использовании php:function('_','Hello') не получится нормальными средставами создавать .po файл
 

Alexandre

PHPПенсионер
<xsl:value-of select="php:function('_','Hello')"/>
это не очень хороший стиль преобразований.

по вопросу не отвечу - не пробовал.

Для того, чтоб совместить геттекст с libxslt, и чтоб это было быстро - надо писать плагин на сях (аналог плагина regexp ). Думаю это не трудно, но надо просто потратить время.
все остальные решения - кривоваты, типа
Код:
<xsl:value-of select="php:function('_','Hello')"/>
 

alexcrown

Новичок
В xslt-шаблоне для элементов, которые нужно перевести указывать атрибуты lang="en" gettext="true".

Потом отнаследоваться от XSLTProcessor и переопределить метод XSLTProcessor->importStylesheet(DOMDocument $stylesheet ) в котором пробежаться по $stylesheet (например с помощью xpath) и для всех узлов с атрибутами lang="<язык>" gettext="true" выполнить gettext() и заменить значение узла на переведённое, а атрибут lang установить равным языку перевода.

Эти xslt-шаблоны можно закэшировать, чтобы в дальнейшем не использовать преобразование (хотя, нужно уметь как-то отслеживать изменение языкового файла, м.б. добавить туда версию как термин?).
 

denver

?>Скриптер
Crys
Не совсем это HTML. Правильно будет что-то типа:
<h1><? echo _('Hello'); ?></h1>

Ну и в XSLT можно делать то же самое собственно. Просто перед применением эвалюэйтить.

alexcrown
отнаследоваться от XSLTProcessor и переопределить метод XSLTProcessor->importStylesheet(DOMDocument $stylesheet ) в котором пробежаться по $stylesheet (например с помощью xpath) и для всех узлов с атрибутами lang="<язык>" gettext="true" выполнить gettext() и заменить значение узла на переведённое
Это второй вариант (Вот только зачем lang='en' писать?). Это для тех случаев когда XSLT нужен обязательно правильный, т.е. XML совместимый. Ну да я вообще делаю вот так:
<loc:text>Hello</loc:text>
Такое реплэйсить проще я думаю.
 

Alexandre

PHPПенсионер
Ну и в XSLT можно делать то же самое собственно. Просто перед применением эвалюэйтить.
не правильное это решение - использование динамических XSLT- шаблонов, хотя иногда, выхода нет.
 

alexcrown

Новичок
Автор оригинала: denver
Вот только зачем lang='en' писать?
По моему так красивее и понятнее. Ну и xml:lang это стандартный атрибут XML, почему бы его не использовать?
Сравни:
PHP:
<message><loc:text>Hello</loc:text></message>
и
PHP:
<message xml:lang="en">Hello</message>
 

denver

?>Скриптер
Я имел в виду что что-то одно тут явно лишнее:
PHP:
<message xml:lang="en" gettext="true">Hello</message>
Кстати, как alexcrown будем аттрибуты-то переводить? :)
PHP:
<input type="submit" value="Hello" />
ЗЫ. Впрочем вопрос снимается :) решение вылетело из головы. Оно простое. Не буду сюда писать)
 

alexcrown

Новичок
gettext="true" мне тоже не нравится, это я сходу придумал :) На самом деле всё равно что-то нужно придумать, чтобы отличать то, что надо переводить от просто метки языка (например текст статьи может быть размечен с указанием языков абзацев).

И еще проблема: как быть с подстановками во фразах (%s) и с множественными формами фраз?

Про атрибуты не подумал. Какое решение?
 

denver

?>Скриптер
как быть с подстановками во фразах (%s)
Решается если юзать разметку <loc:var name="%s">...</loc:var> :-P

и с множественными формами фраз?
Это что такое? Например.

Про атрибуты не подумал. Какое решение?
Элегантное, XSLTшное :-P
 

alexcrown

Новичок
Автор оригинала: denver
Это что такое? Например.
Способ задавать перевод в зависимости от количества элементов. Например так:

В po-файле:
PHP:
"Plural-Forms: nplurals=4; \
    plural=n == 0 ? 0 : \
               n%10==1 && n%100!=11 ? 1 : \
               n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 2 : 
               3; \n"
...
#: Комментариев нет.
msgid "Comment"
msgid_plural "Comments (%s)"
msgstr[0] "Комментариев нет."
msgstr[1] "Один комментарий."
msgstr[2] "%s коментария."
msgstr[3] "%s комментариев."
А в коде это выглядит так:
PHP:
ngettext("Comment", "Comments (%s)", count($comments))

Элегантное, XSLTшное :-P
А, допер :)
 
Сверху