bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

i18n в tmpl-specs #986

Open kompolom opened 8 years ago

kompolom commented 8 years ago

Хочется чтобы tmpl-specs не падали на шаблонах с i18n. В обычной сборке i18n доступен из this.i18n(). А как сделать, чтобы также было в шаблонах? В шаблонах тоже получается доступно но через this.require('i18n'). Но так не работает в enb server. Для сборки используем enb-bemxjst-i18n

Привожу конфиг

tadatuta commented 8 years ago

cc @blond

qfox commented 8 years ago

Получится через prependFiles подмешать какую-нибудь штуку, которая сделает из this.require('i18n') this.i18n в tmpl-specs?

kompolom commented 8 years ago

@zxqfox Идея мне нравится. Но я понятия не имею как пробросить i18n в нужный контекст.

kompolom commented 8 years ago

нашел вот такую конструкцию:

oninit(function(exports, context) {
    var BEMContext = exports.BEMContext || context.BEMContext;
    BEMContext.prototype.i18n = ' + I18NCode + ';
});

Делает как раз то что нужно. Вопрос как ее в файл добавить

qfox commented 8 years ago

Сохрани на диск и добавь путь в prependFiles ;-)

tadatuta commented 8 years ago

Если не хочется на диск, можно прямо в конфиге генерить с помощью https://github.com/enb/enb/blob/master/techs/write-file.js и потом https://github.com/enb/enb/blob/master/techs/file-merge.js

kompolom commented 8 years ago

@tadatuta А как добавить технологии к сборке tmpl-specs?

qfox commented 8 years ago

@kompolom там пока нельзя, и сложно сделать, чтобы было можно. Я понял, что это не особо часто нужно и сделал подмешивание файлов в начало и конец

kompolom commented 8 years ago

@zxqfox Я так и думал... Что то не особо помогло. Файлы примешиваются ко всем движкам... (там еще bh.js) и сборка тестов падает.

qfox commented 8 years ago
if (typeof BH !== 'undefined') { код для BH }
if (typeof BEMHTML !== 'undefined') { код для BEMHTML }

?

kompolom commented 8 years ago

Решение: 1) создаем файл injectI18N.js

if(typeof exports.BEMHTML !== 'undefined') {
    BEMContext = exports.BEMHTML.BEMContext;
    BEMContext.prototype.i18n = global.BEM.I18N;
}

2) в конфиге сетов добавляем

appendFiles : ['../../.enb/injectI18N.js'],

3) и в настройках технологии уже

options : {
  requires : { i18n : { globals : 'BEM.I18N' } },
  sourceSuffixes : ['bemhtml.js', 'bemhtml'],
  exportName : 'BEMHTML',
  devMode : true
}