Инструменты пользователя

Инструменты сайта


limb3:ru:packages:web_app:multilanguage

FIXME Документация по этому разделу устарела

Работа с мультиязычными проектами

Для интернационализации (i18n) проектов сделанных на базе Limb существуют различные средства.

Мы рекомендуем для начала изучить возможности пакета I18N, который предоставляет базовые средства для перевода контента в шаблонах и php-коде на различные языки, работу с локализованными датами и числами, работу с UTF-8, локализацию ошибок валидации.

Некоторые моменты, на которые нужно обратить внимание при работе с мультиязычными проектами:

Установка локали

Текущая локаль определяет, как будут работать большинство тегов и фильтров шаблонной системы, подсистема перевода и т.д. Объект локали хранится в lmbToolkit.

Обычно локаль ставится (или определяется) в lmbToolkit где-то в одном из фильтров цепочки фильтров.

Например, фильтр lmbLocaleSetFilter, который хранится в CMS_CORE пакете, работает по следующему принципу:

  • если в объекте пользователя указано название локали явно - устанавливается эта локаль, иначе…
  • если текущий адрес страницы содержит тот или иной шаблон, например /ru, /de, то устанавливается та или иная локаль, иначе…
  • устанавливается локаль по-умолчанию.

Пример использования данного фильтра:

    $this->registerFilter(new lmbHandle('limb/cms/src/filter/lmbLocaleSetFilter',
                                         array('ru', array('/english*' => 'en',
                                                           '/russian*' => 'ru'))));

см. limb/cms/src/filter/lmbLocaleSetFilter.class.php

Необходимость компиляции шаблона для каждого языка

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

 {$'translate me please'|i18n:'/my_project'}

такой участок шаблона переведется уже на этапе компиляции с использованией того языка, который стоит в текущий момент (lmbToolkit :: instance()→getLocale()→getLocaleString())

Поэтому нам нужно, чтобы для различных языков, выполнялась своя компиляция, хоть и одного и того же шаблона. Это можно осуществить, введя дополнительные критерии, по которым формируется имя откомпилированного шаболна, от чего зависит, есть ли для шаблона откомпилированная версия или же компиляцию нужно провести еще раз.

Это достигается путем перекрытия метода lmbTemplateUtils :: _collectParams(), например, так:

class lmbMyProjectTemplateUtils extends lmbTemplateUtils
{
  protected function _collectParams()
  {
    $locale = lmbToolkit :: instance()->getLocale()->getLocaleString();
    return array('locale' => $locale);
  }
}

Не забудьте зарегистрировать ваш новый TemplateUtils в lmbToolkit!

Загрузка словарей

В настоящий момент словари для перевода нужно самостоятельно загружать в систему. Это осуществляется при помощи фильтра lmbTranslationDictionaryLoadingFilter, который в конструкторе принимает путь до каталога, где хранятся словари:

    $this->registerFilter(new LimbHandle(LPKG_I18N_DIR . '/src/filter/TranslationDictionaryLoadingFilter',
                                         array(LIMB_PKG_MY_PROJECT_DIR . '/i18n/translations/')));

см. LPKG_I18N_DIR/src/filter/lmbTranslationDictionaryLoadingFilter.class.php

Перевод ошибок валидации

Ошибки большинства правил валидации (см. пакет VALIDATION) используют глобальную функцию tr() для формирования ошибок. По-умолчанию, эта функция просто возвращает переданную ей фразу без перевода. Эта функция перекрыта в пакете I18N, что обеспечивает возможность использования механизма перевода для локализации ошибок валидации.

Вывод контента в шаблонах, в зависимости от языка

Можно использовать возможности тегов <limb:site_branch> и <limb:site_branch_selector> (см. LPKG_CORE_DIR/src/template/tags/core/), например:

 <limb:site_branch_selector>
   <limb:site_branch default='true'>
     Что-нибудь для русско-говорящих
   </limb:site_branch>
   <limb:site_branch path='/en\*'>
     Something for english speaking
   </limb:site_branch>
 </limb:site_branch_selector> 

Также возможно использование тега <limb:current_locale> (см. limb/i18n/src/template/tags/), который выводит часть шаблона, если текущий название текущей локали совпадает со значением аттрибута name, например:

  <limb:current_locale name='ru'>
     Что-нибудь для русско-говорящих
  </limb:current_locale>
 
  <limb:current_locale name='en'>
     Something for english speaking
  </limb:current_locale>

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   __ __   ___    ____   __ __  _____
  / // /  / _ )  / __/  / //_/ / ___/
 / _  /  / _  | / _/   / ,<   / (_ / 
/_//_/  /____/ /___/  /_/|_|  \___/
 
limb3/ru/packages/web_app/multilanguage.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)