Мультиязычность в Текстпаттерн - простой способ.

Для Текстпаттерн уже существует достаточно мощное решение, позволяющие построить полноценный мультязычный сайт: поддерживается перевод названия секций, категорий, мультиязычные версии статей, просто случайные текстовые фразы (сниппеты), отображающие нужный пеервод в завимисоти от выбранного языка на сайте.

Но установка MLP и перевода сайта под него — процесс достататочно хлопотный, хотя и не сложный. Иногда существует необходимость более простого решения.

Идея заключается в том, языковые версии статьи, например, будут выдаваться Текстпаттерном в зависимости от установленного браузером параметра Accept-Language.

Используемый ниже код будет работать в Текстпаттерн, начиная с версии 4.0.7, т.к. используется тег <txp:varaible />.

Создание мультиязычной статьи:

1. Создаем форму с именем accept-language, в которой будет находиться следующий код:

<txp:php>
variable(array('name' =>'accept-language', 'value' => 'ru'));
$al = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
if (preg_match('/(.*?)[,;-]/', $al, $a)) {
    variable (
        array (
              'name' =>'accept-language', 
              'value' => $a[1]
        )
    );
}
// split article titles
$titles = explode(" | ", $GLOBALS['thisarticle']['title']);
$i=0;
foreach ($titles as $title) $titles[$i++] = explode(":", $title);

$i=0;
foreach ($titles as $title) $titles[$i][0]==$lang ? $key=$i : $i++;

variable (
  array (
    'name' =>'title_l10n', 
    'value' => $titles[$key][1]
  )
);
</txp:php>

2. Принцип работы кода:

  1. Cкрипт смотрит содержимое переменной $_SERVER['HTTP_ACCEPT_LANGUAGE']
  2. Если проблем с с переменной нет – помечает переменную Текстпаттерна нужным языком.
  3. Если же, по каким либо причинам, не найдена переменная $_SERVER['HTTP_ACCEPT_LANGUAGE'], или не удается вычленить оттуда язык, в переменную Текстпаттерна будет записан язык по-умолчанию – указан во второй строчке скрипта (в нашем примере это ru).

3. Вызов данной формы необходимо поместить на странице выше тега <txp:article />, либо вверху формы этого тега, до тега <txp:body />, либо в самом начале тела статьи.

4. Внутри тела статьи различные языковые версии разделяем тегом <txp:if_variable name="accept-language" value="КОД_ЯЗЫКА">. КОД_ЯЗЫКА – один из ISO кодов языков, например, ru, en, fr, de.

5. Заголовок статьи пишем в таком формате: ru:Проверка работы мультиязычности | en:English title | de:Deutsche sprache – обратите внимание на наличие и отсутствие пробелов.

6. Там, где мы раньше использовали <txp:title />, теперь надо будет использовать <txp:variable name="title_l10n" /> – т.к. заголовок тоже переводится. Нужно внимательно следить, чтобы форма accept-language вызывалась ДО <txp:variable name="title_l10n" /> – лучше всего ее поместить в самый верх свой страницы (Оформление – Страницы)

Пример.

Вставим следующий код в тело статьи:

<txp:output_form form="accept-language" />
<txp:if_variable name="accept-language" value="ru">
	Тут у нас русский текст.
<txp:else />
	Текст для НЕ русских посетителей.
</txp:if_variable>

Если же необходимо выводить несколько вариантов перевода, например, для русского, английского и немецкого языков, при этом английский язык должен выводиться по-умолчанию, то код нужно изменить таким образом:

<txp:output_form form="accept-language" />
<txp:if_variable name="accept-language" value="ru">
	Тут у нас русский текст.
	<txp:variable name="translated" value="1" />
</txp:if_variable>

<txp:if_variable name="accept-language" value="en">
	Английский текст будет здесь.
	<txp:variable name="translated" value="1" />
</txp:if_variable>

<txp:if_variable name="accept-language" value="de">
	Немецкий язык пишем в этом коде
	<txp:variable name="translated" value="1" />
</txp:if_variable>

<txp:if_variable name="translated " value="1">
<txp:else />
	Здесь должен быть текст, который выводиться,
	если язык посетителя не был определен.
</txp:if_variable>

Пример работы скрипта

Пример работы скрипта мультиязычности в Textpattern. В нем же есть подсказки, как сменить язык браузера, чтобы проверить работу скрипта.

Также, можно усложнить предложенный код, чтобы пользователь мог самостоятельно определять какой язык ему предпочтительней. Об этом пойдет речь в одной из следующих статей.

Обновление: обновил код, убрал точку с запятой, которая рушила код. Сейчас должно работать :)

Комментарии:

    • AngryCAT
    • 12 июля 2009
    • Ценная статья. Нужно будет использовать в работе.

    • itshaman
    • 12 июля 2009
    • Хорошая статья

    • the_Ghost
    • 12 июля 2009
    • Спасибо, старался. Буду счастлив увидеть примеры реализации этой идея в виде ссылок.

    • anita
    • 13 июля 2009
    • Мнение о (простой) мультиязычности еще не созрело, но вопросы уже есть, надо только сформулировать пограмотней.
      Отлично, что создали этот сайт, I love TXP! Учитывая личности авторов, многого можно ожидать. нужный пеервод в завимисоти – это круто, не надо исправлять, очень настроение поднимает.
      Искренне желаю успехов.

    • Mut@NT
    • 12 апреля 2010
    • Все отлично работает, но как перевести заголовок статьи??

    • Виктор
    • 12 апреля 2010
    • Дописал технологию. Уже, конечно, не так просто выглядит. Но разобраться можно.

    • Mut@NT
    • 12 апреля 2010
    • Ошибка:
      Parse error: syntax error, unexpected ‘;’, expecting ‘)’ in /home/public_html/cleaner-vacuum/textpattern/publish/taghandlers.php(3127) : eval()‘d code on line 23

    • Mut@NT
    • 12 апреля 2010
    • Нужно убрать запятую в строке:
      ‘value’ => $titles[$key]1

    • Mut@NT
    • 12 апреля 2010
    • После чего в заголовке наш код, без требуемого эффекта

    • Дмитрий
    • 30 апреля 2010
    • Интересная реализация! Только как быть с индексацией такого сайта поисковиками?

    • the_ghost
    • 30 апреля 2010
    • Хороший вопрос. По логике работы кода, если не указан HTTP_ACCEPT_LANGUAGE, то в нашем примере будет выводится английский

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

Ваше мнение о простой мультиязычности [11]

  •  
  • Textile HTML Отображение
    _выделение_ <em>выделение</em> выделение
    *усиление* <strong>усиление</strong> усиление
    __курсив__ <i>курсив</i> курсив
    **полужирный** <b>полужирный</b> полужирный
    ??цитата?? <cite>цитата</cite> цитата
    bq. большая цитата <blockquote>большая цитата</blockquote>
    большая цитата
    -удалённый- <del>удалённый</del> удалённый
    +вставленный+ <ins>вставленный</ins> вставленный
    ^надстрочный^ <sup>надстрочный</sup> надстрочный
    ~подстрочный~ <sub>подстрочный</sub> подстрочный
    (с)AngryCAT &#169;AngryCAT ©AngryCAT
    Textile(r) Textile&#174; Textile®
    Textpattern(tm) Textpattern&#8482; Textpattern™
    длиное -- тире длиное &#8212; тире длиное — тире
    короткое - тире короткое &#8211; тире короткое – тире
    "ссылка":http://ya.ru <a href=”http://ya.ru”>ссылка</a> ссылка
    !http://ya.ru/logo.png! <img src=”http://ya.ru/logo.png”>