Jump to main content Jump to doc navigation

Переключатель лексикона MODX для фронтенда. Скачайте через Package Manager менеджера. Страница extra: https://modx.com/extras/package/lingua. Issues: https://github.com/goldsky/Lingua/issues

Background

Пакет написал goldsky, первый релиз 6 июня 2013 года, изначально для Adam Wintle из Monogon для китайского и тайского сайтов.

Addon создан для мультиязычного сайта без путаницы с контекстами. Концепция основана на пакете Translations, но разработан с нуля и по другому пути.

CMP

Custom Manager Page управляет списком языков и их настройками.

Plugin

Плагин управляет cookie и session выбранного языка. Плагин даёт плейсхолдер [[+lingua.cultureKey]] для страницы. Для других сниппетов, например выбора языка в email hook, используйте [[!lingua.cultureKey]] ниже.

Snippets

На фронтенде Lingua предоставляет utility-сниппеты. У всех сниппетов есть &toArray для вывода всех плейсхолдеров и &toPlaceholder для сохранения вывода в указанный плейсхолдер.

lingua.selector

Сниппет переключателя языка на фронтенде. Чанки по умолчанию в стиле dropdown-toggle twitter bootstrap.

При клике по ссылке страница перезагружается с дополнительным REQUEST-параметром для языковой session. Ключ REQUEST задаётся в System Setting, по умолчанию lang.

Properties

Name Description Example Default Value Options
tplWrapper чанк шаблона обёртки &tplWrapper=chunkName lingua.selector.wrapper chunk's name, @BINDINGs enabled
tplItem чанк шаблона элемента &tplItem=chunkName lingua.selector.item chunk's name, @BINDINGs enabled
sortby сортировка вывода по имени поля &tplItem=lcid_string id id, local_name, lang_code, lcid_string, lcid_dec
sortdir направление сортировки &sortdir=ASC asc asc, desc
phsPrefix префикс плейсхолдеров, чтобы не конфликтовать с другими пакетами &phsPrefix=lingua. lingua. (string)
codeField поле, значение которого используется для options &codeField=lang_code System Setting's lingua.code.field id, local_name, lang_code, lcid_string, lcid_dec

@BINDING в чанках означает:

  • chunk name
  • @FILE:[[++core_path]]path/to/chunk/file.tpl
  • @CODE: [[+lingua.languages]]

Default Chunks

lingua.selector.wrapper
<div class="container">
    <div class="btn-group">
        <button class="btn btn-link btn-mini dropdown-toggle"
                data-toggle="dropdown"
                >[[%lingua.select_language]]
        </button>
        <ul class="dropdown-menu">
            [[+lingua.languages]]
        </ul>
    </div>
</div>
lingua.selector.item
[[+lingua.cultureKey:is=`[[+lingua.lang_code]]`:then=``:else=`<li>
    <a href="[[+lingua.url]]" title="[[+lingua.local_name]]">
        <img src="[[+lingua.flag]]" alt=""/> [[+lingua.local_name]]
    </a>
</li>`]]

В этом чанке по умолчанию текущий язык скрывается через Output Filter.

lingua.cultureKey

Сниппет возвращает текущий активный язык. Содержит только

return $modx->cultureKey;

Это не то же самое, что

return $modx->getOption('cultureKey');

Этот сниппет ключевой для получения лексиконов языка.

Version 1: Обратите внимание на восклицательный знак перед %login. Лексикон должен быть +UN+CACHED.

[[!%login? &namespace=`Login` &language=`[[!lingua.cultureKey]]`]]

Version 2: У Lingua своя папка кэша. Переведённые страницы в разных файлах, всё можно кэшировать.

[[%login? &namespace=`Login` &language=`[[lingua.cultureKey]]`]]

lingua.getField

Сниппет возвращает значение настройки языка Lingua для текущего языка страницы. Значение переключается на выбранный активный язык.

Properties

Name Description Example Default Value Options
field любое поле для выборки &field=date\_format\_lite all available fields: id, active, local_name, lang_code, lcid_string, lcid_dec, date_format_lite, date_format_full, is_rtl, flag
codeField поле, значение которого используется для options &codeField=lang\_code System Setting's lingua.code.field id, local_name, lang_code, lcid_string, lcid_dec
Examples
Created on: [[*createdon:date=`[[!lingua.getField? &field=`date_format_lite`]]`]]

lingua.getValue

Сниппет возвращает переведённое поле ресурса для текущего языка страницы. Значение переключается на выбранный активный язык.

Properties

Name Description Example Default Value Options
field имя "key" или поля в базе данных. required * &field=pagetitle Main fields: pagetitle, longtitle, description, alias, link_attributes, introtext, content, menutitle, uri, uri_override, properties
or any Template Variable's name
id id ресурса для получения значения &id=[[+snippetPrefix.id]] Current resource integer
Examples

В rowTpl wayfinder замените плейсхолдер так:

<li[[+wf.id]][[+wf.classes]]>
    <a href="[[+wf.link]]" title="[[+wf.title]]" [[+wf.attributes]]>
        <-- [[-+wf.linktext]] -->
        [[lingua.getValue:default=`[[+wf.linktext]]`? &id=`[[+id]]` &field=`pagetitle`]]
        <!-- rowTpl -->
    </a>
    [[+wf.wrapper]]
</li>

Version 2.0.0+

С версии 2 Lingua хранит клонированный контент ресурса, основной content и все заданные Template Variables.

Template Variables

Откройте Custom Manager Page (Components > Lingua) и укажите TV, доступные для перевода.

Standard MODX fields (pagetitle, content, etc.)

Также нужно задать дополнительную настройку для контекста, где работает Lingua. В дереве ресурсов > правый клик > edit context.

Editing the Context

Right click на контексте, где должен работать Lingua, затем "Edit context":

Добавьте на вкладке "Context Settings":

  • key: modRequest.class, value: LinguaRequest

После сохранения настройка появится в сетке.

Multiple contexts

Для разных языков в разных контекстах добавьте:

  • key: lingua.langs, value: en,de,...

Эта настройка переопределяет список активных языков из Custom Manager Page.

<= Version 2.0.0-beta3

В самом плагине нужно было указать контексты в element tree > Plugin > категория Lingua > плагин Lingua.

На вкладке "Properties" нажмите "Default Properties Locked" и измените:

  • name: lingua.contexts, value: web, your_other_context1, your_other_context2

Version 2.0.0-rc1

В этой версии настройки перенесены в System Settings MODX, чтобы не перезаписывались при обновлении.

Template Variable's Cloning Patterns

При клонировании TV Lingua дублирует формы ввода TV. Чтобы избежать конфликтов Javascript, Lingua меняет ID в html/js кодах.

Для custom TV создайте новые паттерны.

Откройте CMP, вкладка "Template Variables", затем "Cloning Patterns".

Там примеры паттернов core TV и MIGX.

Можно создать новый или дублировать существующий правым кликом по строке.

ID для паттернов берите из шаблона TV.

По tutorial " Adding a Custom TV Type - MODX 2.2" формы ввода лежат в "core/components/ourtvs/tv/input/tpl/".

Найдите ID вида {$tv->id} и добавьте их в Cloning Patterns.

Limitation

Из-за концепции Lingua, клонирования стандартного контента MODX для других языков, нельзя ожидать другую структуру сайта на вторичных языках.

Для этого подходит Babel.

Incompatibility

Lingua несовместима с custom TV, которые хранят значения вне базы TV MODX.

Известная несовместимость:

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more