Всем привет!
Пытаюсь разобраться в работе модуля enb-bem-i18n на примере project-stub. Для эксперимента использую блок calendar, точнее его элемент title https://github.com/Sergei-b84/calendar
{
block: 'calendar',
mods: { theme: 'ls' },
switchers: ['', '']
},
Очередность моих действий:
Установил модуль следующей командой:
npm install --save-dev enb-bem-i18n
- Изменил код шаблона calendar__title.bemhtml
c
block('calendar').elem('title')(
content()(function(){
var monthName = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];
var date = this._date;
var title = monthName[date.getMonth()] + ' ' + date.getFullYear();
return title;
})
);
на
block('calendar').elem('title')(
match(function () { return this.ctx.date; }).content()(function () {
var date = new Date(this.ctx.date),
i18n = BEM.I18N,
month = [
i18n('calendar__title', 'jan'),
i18n('calendar__title', 'feb'),
i18n('calendar__title', 'mar'),
i18n('calendar__title', 'apr'),
i18n('calendar__title', 'may'),
i18n('calendar__title', 'jun'),
i18n('calendar__title', 'jul'),
i18n('calendar__title', 'aug'),
i18n('calendar__title', 'sep'),
i18n('calendar__title', 'oct'),
i18n('calendar__title', 'nov'),
i18n('calendar__title', 'dec')
];
var title = month[date.getMonth()] + ' ' + date.getFullYear();
return title;
})
);
- создал папку с файлами ru.js и en.js https://github.com/Sergei-b84/calendar/tree/master/__title/calendar_title.i18n.
Теперь, для того чтобы все заработало, я как понимаю, мне нужно указать язык по умолчанию в каком-то конфиге и сделать какие-то изменения в .enb/make.js . Опишите, пожалуйста, подробно как это сделать на примере project-stub. ( как выглядит конфиг, куда кладем, где подключаем и какие пишем изменения в make.js) Спасибо.
Привет!
Для версии
enb-bem-i18n@0.4.0
в конфиг нужно добавить:В технологии добавить:
Плюс, вместо
enb-bemxjst/techs/html-from-bemjson
технологии использоватьenb-bem-i18n/techs/i18n-bemjson-to-html
. А вaddTargets()
вместо?.html
передать?.{lang}.html
.Сделал как Вы написали. Ответ сервера:
Да, забыл про это сказать. Надо указать опцию
templateFile: '?.bemhtml.js'
.Все сделал, ошибка ушла, но текст calendar__title так и не появился.
вот мой файл make.js. Может где ошибся. Не пойму, где мы указываем, что нужно именно использовать русский язык, а не английский? Что-то еще ведь нужно прописать.
Извините, никто не знает в чем ошибка? Может есть реализованный пример на гит-хабе. собранный с помощью enb
@Sergei-b84, сделал веточку в project-stub — там настроена сборка и приведены примеры использования в шаблонах и в клиентском JS.
Спасибо за помощь. Вопрос. У вас из файла package.json видно, что версия "enb-bem-i18n": "^1.0.0-beta7" (последняя). У меня "version": "0.4.0", перестанавливал enb-bem-i18n, все равно 0.4.0 . В чем причина ведь зависимость данного модуля только от пакета enb (моя версия которого "^0.17.2"?
при установке
npm
по умолчанию ставит последнюю стабильную версию. чтобы поставить альфу, нужно явно это указать:Можно ещё по названию тега в
npm
:Не ставит и альфу
Проблема в том, что я сделал все как описано в ветке и у меня появляется ошибка Error: Cannot find module 'enb-bem-i18n/techs/i18n'
Так получилось
@tadatuta все верно в созданной Вами ветке? У меня в консоли ничего не отображается? Как должны создаваться файлы типа index.{lang}.min.js ?
Объясните, пожалуйста. что выполняет данный код:
данный код подключает в сборку https://github.com/bem/bem-core/tree/v2/common.blocks/i-bem/__i18n
Файлы
index.{lang}.min.js
должны создаваться автоматически при вызовеenb make
или с помощьюenb server
. Если этого не происходит, возможно, где-то закрался баг, могу проверить.Нет, не происходит. BEM Core Library должна быть установлена?
Если честно, то на первый взгляд у меня и проект как-то туго стал собираться после внесенных изменений в файл make.js. Есть у меня счетчик. Сейчас проверяю различные алгоритмы ( это не столь важно). Для этого просто меняю названия блоков между counter и counter2. Cоответственно для каждого блока свой js файл со своим алгоритмом. Что я заметил, раньше при стандртном make.js счетчики менялись моментально стоило мне дописать или убрать 2. При новом make.js (с ветки) смены не происходит вообще. И кеш браузера чистил все одно и тоже. Дошло до того, что я просто любой блок переименовываю абракатаброй какой-нибудь, заливаю и стили не меняются).
Прошел весь путь с нуля:
Открыл http://localhost:8080/desktop.bundles/index/index.ru.html — все хорошо.
Возникла мысль, что возможно у тебя после старых сборок остался старый index.html, в котором подключен старый index.min.js, а нужно-то открывать index.ЯЗЫК.html, где подключен index.ЯЗЫК.min.js. Потому и изменений не видно.
По поводу скорости пересборки. Очевидно, что полная при нескольких языках полная сборка будет медленнее, чем раньше, но точечная в режиме сервера должна замедлиться совсем чуть-чуть (десятки/сотни миллисекунд).
Спасибо, теперь все работает. Вот код
@tadatuta для чего в bemhtml applyNext() ?
Правильно я понимаю, что для общего блока page я создаю только page.bemhtml.js c кодом
а для всех вложенных блоков использую конструкцию по примеру из ветки?
Это вызов всех остальных шаблонов для данного матча. Я расписывал подробно здесь.
Этот шаблон нужен для того, чтобы в каждый генерируемый HTML подключался нужный JS-файл. Нужен он только в
page.bemhtml.js
.