2

keystone.js アプリに i18n を含めようとしています。私はこの例https://gist.github.com/JedWatson/9191081のようにやっていますが、うまくいきますが、私の問題は現在のロケールを表示することです。URL パラメータでロケールを設定するためのミドルウェアを使用しています。

// middleware.js
exports.setLocale = function (req, res, next) {
    if (req.params.lang) {
        req.setLocale(req.params.lang);
    }
    else
        res.redirect('/ru/');
    next();
};

// index.js
keystone.pre('render', middleware.setLocale);

およびルーティング

app.get('/:lang/', routes.views.index);
app.get('/:lang/blog/:category?', routes.views.blog);
app.get('/:lang/blog/post/:post', routes.views.post);
...

デフォルトのロケールは「ru」です。しかし、私の見解では

view.on('render', function (next) {
    console.log('on render', req.getLocale());
    next();
});

console.log('before render', req.getLocale());
view.render('blog');

ルート上/en/blogで出力します

------------------------------------------------
KeystoneJS Started:
qalqan is ready on default port 3000
------------------------------------------------

before render ru
on render en
GET /en/blog 304 373ms

したがって、私が理解しているように、変数がビューに送信された後にロケールが変更されます。レンダリングする前に設定する方法はありますか? 各ビューのurl param から req.params で取得できることはわかっていlangますが、すべてのビューでミドルウェアで取得したいと考えています。

4

1 に答える 1

1

更新: i18n バージョン 0.7.0 以降、コードは機能するはずです。

少し直感に反するように思えますが、 lang パラメータの繰り返しを避けるために、ルーティングに手を加えるべきではないと思います。

あなたはまさに正しい道を進んでいますが、これが私がしたことです:

// routes/middleware.js

exports.detectLang = function(req, res, next) {
    var match = req.url.match(/^\/(de|en)([\/\?].*)?$/i);

    if (match) {
        req.setLocale(match[1]);
        // Make locale available in template
        // (necessary until i18n 0.6.x)
        res.locals.locale = req.getLocale();
        // reset the URL for routing
        req.url = match[2] || '/';
    } (else) {
        // Here you can redirect to default locale if you want
    }

    next();
}

他のすべての res.locals が定義される前に、ミドルウェアを使用するだけです。

// routes/index.js

keystone.pre('routes', i18n.init);
keystone.pre('routes', middleware.detectLang);

これで、すべての URLの先頭に を追加できるように'/' + res.locals.localeなり、ユーザーはアプリのどこでもロケールを維持できます。

于 2016-02-11T12:16:28.430 に答える