Bonjour,

Tout d'abord excusez-moi si ce n'est pas la bonne section, je n'en ai pas trouvé pour Node.js.

Je développe un site web avec node et connect de sencha, et je voudrais mettre en place une internationalisation. Je voudrais donc que les pages HTML que je délivre actuellement via connect.static passent par une étape de compilation qui remplace des labels {lang.MAPROPRIETE} par le texte de la langue de mon choix.

J'ai réussi à récupérer le header http Accept-Language, et je voudrais maintenant coder un wrapper autour de connect.static pour remplacer les labels contenus dans la réponse avant envoi. Là où je bloque, c'est comment appliquer ma fonction de traduction en l'intercalant entre le stream de lecture et le stream d'écriture response. Je ne suis pas sûr de comprendre complètement le fonctionnement des Stream dans Node et de la fonction pipe.

Voilà où j'en suis en code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
var send = require('send');
var stream = require('stream');
var utils = require('connect').utils;
var parse = utils.parseUrl;
var url = require('url');
 
// Connect.static with lang detection and translation
module.exports = function (root, options) {
 
    if (!root) throw new Error('static() root path required');
 
    options = options || {};
    if (!options.default_locale) {
        options.default_locale = 'en';
    }
 
    return function staticlang(req, res, next) {
        var accept_language = req.headers['accept-language'];
        var locales = [];
 
        if (accept_language) {
            accept_language.split(',').forEach(function (lang) {
                locales.push(lang.split(';', 1)[0].toLowerCase());
            });
            req.locales = locales;
        } else {
            req.locales = [options.default_locale];
        }
 
        if ('GET' != req.method && 'HEAD' != req.method){ next(); }
        else {
            var path = parse(req).pathname;
            var pause = utils.pause(req);
            console.log("Connect lang ",req.locales, path);
 
            send(req, path)
                .maxage(options.maxAge || 0)
                .root(root)
                .hidden(options.hidden)
                .on('error', function error(err) {
                    if (404 == err.status) {  next(); pause.resume(); }
                    else { next(err); }
                })
                .on('directory', function directory() {
                    if (options.redirect === false) { next(); pause.resume(); }
                    else {
                        var pathname = url.parse(req.originalUrl).pathname;
                        res.statusCode = 301;
                        res.setHeader('Location', pathname + '/');
                        res.end('Redirecting to ' + utils.escape(pathname) + '/');
                    }
                })
                .on('data', function(data){
                    console.log("Data: ",data); //<- je ne reçois rien ici
                })
                .pipe(res);
        }
 
    };
};
Je ne souhaite pas utiliser un langage de templating côté serveur car j'utilise déjà handlebars côté client.
Merci d'avance pour votre aide.