对于短字符串和消息,现有的i18n
服务在Sails中相当不错,但是,我希望将部分模板提取为Markdown格式的所谓片段,并从模板中获取它们
我创建了以下结构:
现在我想根据模板中的活动区域设置包含其中一个片段:
<section class="introduction">
<h2>Introduction</h2>
{{ fragment('index.introduction') }}
</section>
扩展Sails以支持此类碎片的最佳方法是什么?
fragment
功能公开给视图层?我在哪里定义这个功能?答案 0 :(得分:0)
我已创建a library来处理此类用例。以下代码已合并到此库中。
可以使用表达式res.locals
属性公开fragment
函数。您可以通过routes
。
当前区域设置通过req.getLocale()
函数公开。
这里是我生成的钩子的完整代码:
module.exports = function (sails) {
var deasync = require('deasync');
var fs = require('fs');
var marked = require('marked');
var configKey = 'i18n-fragment';
var activeLocale;
var defaults = {};
defaults[configKey] = {
path: 'locales/fragments/{locale}/{path}.md'
};
return {
defaults: defaults,
routes: {
before: {
'/*': function (request, response, next) {
if (request.accepted.some(function (type) {
return type.value === 'text/html';
})) {
activeLocale = request.getLocale();
response.locals.fragment = deasync(getFragment);
}
next();
}
}
}
};
function getFragment (address, callback) {
var path = getFragmentPath(address, activeLocale);
fs.readFile(path, 'utf8', function (error, source) {
if (error) {
return callback(error);
}
marked(source, callback);
});
}
function getFragmentPath (address, locale) {
return sails.config[configKey].path
.replace('{locale}', locale)
.replace('{path}', address.replace('.', '/'))
;
}
};