在Sails中实现自定义i18n片段

时间:2015-07-18 14:25:49

标签: node.js sails.js

对于短字符串和消息,现有的i18n服务在Sails中相当不错,但是,我希望将部分模板提取为Markdown格式的所谓片段,并从模板中获取它们

我创建了以下结构:

  • 语言环境/片段/ EN /索引/ introduction.md
  • 语言环境/片段/ RU /索引/ introduction.md

现在我想根据模板中的活动区域设置包含其中一个片段:

<section class="introduction">
    <h2>Introduction</h2>
    {{ fragment('index.introduction') }}
</section>

扩展Sails以支持此类碎片的最佳方法是什么?

  1. 如何将fragment功能公开给视图层?我在哪里定义这个功能?
  2. 如何获取当前活动的区域设置以了解要加载的文件?

1 个答案:

答案 0 :(得分:0)

图书馆

我已创建a library来处理此类用例。以下代码已合并到此库中。

解决方案

  1. 可以使用表达式res.locals属性公开fragment函数。您可以通过routes

  2. 在钩子中访问它
  3. 当前区域设置通过req.getLocale()函数公开。

  4. 这里是我生成的钩子的完整代码:

    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('.', '/'))
        ;
      }
    
    };