taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

express.jsにgettext系の_関数を仕込む

引き続きnode.js系tips。
node-localizeというモジュールでの言語の管理がちょっとお手軽だったので、これとexpressを組み合わせるようにしてみた。

// express-localize.js
var Localize = require('localize');

module.exports = function(path, defaultLocale) {
    var locale, defaultLocale = defaultLocale || 'en';
    locale = new Localize(path, {}, defaultLocale);

    function _() {
        return locale.translate.apply(locale, arguments);
    }

    return function(req, res, next) {
        var render = res.render
          , lang   = req.query.lang || req.body.lang || req.session._lang || defaultLocale;
        req.session._lang = lang;
        locale.setLocale(lang);

        res.render = newRender;

        next();

        function newRender(template, stash) {
            stash._ = _;
            render.call(res, template, stash);
        }
    };
};

あとはapp.js内で

var expressLocalize = require('./lib/express-localize');
app.configure(function(){
  app.use(expressLocalize(__dirname + '/locale', 'ja'));
});

すれば使えるようになる。