2015-07-18 5 views
1

Существующая служба i18n очень хороша в Sails, когда дело доходит до коротких строк и сообщений, однако я хочу извлечь части шаблонов в так называемые фрагменты в формате Markdown и потребовать от них шаблоны.Реализовать пользовательские фрагменты i18n в Sails

Я создал следующую структуру:

  • локали/фрагменты/EN/индекс/introduction.md
  • локали/фрагменты/RU/индекс/introduction.md

сейчас Я хочу включить один из этих фрагментов в соответствии с активным языком в шаблоне:

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

Что лучший способ расширить Sails для поддержки этого типа фрагментов?

  1. Как вывести функцию fragment на уровень представления? Где я могу определить эту функцию?
  2. Как получить текущий активный язык, чтобы узнать, какой файл загрузить?

ответ

0

Библиотека

Я создал a library обрабатывать такой случай использования. Код ниже включен в эту библиотеку.

Решение

  1. fragment функция может быть экспонируется с использованием Выражает res.locals собственности. Вы можете получить к нему доступ через крючок через routes.

  2. Текущая местность выставлена ​​с помощью функции 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('.', '/')) 
    ; 
    } 

}; 
+0

Вы действительно не должны использовать 'deasync' библиотека – vkurchatkin

+0

Почему? Какая альтернатива? –

+0

Эта библиотека разбита с самого начала. Это просто хак, который работает в некоторых случаях, но не работает в других. Однако альтернативы нет, вы должны использовать асинхронные функции. – vkurchatkin

Смежные вопросы